Warning: The following named parsers don't match the column names: contry_region

R CI Ppt GitHub forks

Profesor:

Curso:

Integrantes

Líder

Introducción

El COVID-19 ha tenido un gran impacto alrededor del mundo y hoy en dia es fácilmente el tema del que más se habla. Todos los países han tomado medidas con respecto a esta pandemia, sin embargo unos las han tomado muy tarde y esto se ha visto afectado en la expansión del virus en ellos. En Perú, las medidas se empezaron a tomar rápidamente, pero una cantidad considerable de la población no ha cumplido con las inmovilizaciones sociales y esto se ha visto reflejado en la expansión del virus en el país. ¿Cómo podemos saber cuáles han sido las medidas más respetadas y por qué? La respuesta a esta pregunta le sería de mucha ayuda al gobierno peruano, ya que con esta información se podría saber que tipo de medidas debería tomar y en qué momentos para que se cumplan de manera satisfactoria. Es por ello que nuestro grupo ha decidido investigar acerca de la efectividad de las medidas tomadas y su relación con la movilización social de los ciudadanos.

Factibilidad

Este trabajo es factible, debido a que la mayor parte de la información la podemos conseguir de gráficos ya existentes con relación al COVID-19 en Perú y la información faltante la podemos adquirir a través de encuestas. Además, los efectos de las medidas tomadas por el gobierno en la movilización social ya se pueden analizar, debido a que su información se obtiene solamente días después de implementarlas. Finalmente, esta investigación se puede llevar a cabo en el tiempo dado, debido a que no es un trabajo que requiera tiempo de espera para llegar a concretarse. Esto quiere decir que lo podemos empezar inmediatamente.

Objetivos

La importancia de este estudio estadístico radica en el análisis de algunas de las medidas que el gobierno ha declarado ante la coyuntura del Covid-19. Es importante estudiar su efecto en la movilización social, puesto que podría otorgar un panorama más holístico y verídico sobre las medidas que generan un impacto positivo en la desaceleración de la propagación del nuevo virus Sars-CoV-2.

Objectivos generales

  • El objetivo de este trabajo es determinar en qué medida las diferentes acciones que ha aplicado el gobierno, desde el inicio del periodo de cuarentena hasta el tiempo del estudio, redujeron el impacto y expansión del Covid-19 en el Perú. Queremos averiguar el efecto de estas medidas en 2 diferentes aspectos. Estos son: la movilización social y de qué manera afectan la curva de aumento de infectados por coronavirus en Perú.

Objetivos específicos

  • Establecer las medidas a estudiar y que estas se encuentren alineadas a la inmovilización social.
  • Desarrollar habilidades de comunicación haciendo uso del programa R-Studio y el lenguaje de R.
  • Establecer los factores que determinan la prestación de servicios públicos y su relación con la propagación del virus.
  • Establecer una relación entre el bono subsidio y el desacato a la inmovilización social.
  • Establecer las principales razones de las personas para desobedecer la inmovilización social.

Marco Teórico

Población objetivo

La población de interés son los ciudadanos peruanos. Para lograr que nuestras unidades muestrales sean los más representativa posible, hemos decidido delimitar nuestra población objetivo al área de Lima. Esto se debe a que nuestros encuestados se encuentran en esta zona y la mayor cantidad de población se encuentra aquí.

Unidad muestral

  • Para las encuestas nuestra unidad muestral son los alumnos de la Universidad UTEC y sus familias [18 - 50 años]
  • Con respecto a los datos y gráficos brindados por la web, nuestra unidad muestral es la ciudad de Lima.
  • Accederemos a las observaciones y/o mediciones de las unidades muestrales mediante fuentes de internet que presentan fiabilidad, respaldo del gobierno. Del mismo modo, se realizarán encuestas a los alumnos de UTEC y sus familiares a través de preguntas relacionadas con su movilización social antes y durante la cuarentena. Ello con el propósito de encontrar las razones de movilización

Muestreo

Tipo de muestreo

El tipo de muestreo es aleatorio simple estratificado para ciudadanos con edades entre 18-50 años. Ello, dado que todos los individuos de subconjunto de la población objetivo tienen la misma probabilidad de ser seleccionados.

Tamaño de la muestra

  • Para la investigación, se busca cumplir por lo menos con: <0.05, e<0.05 *Para encontrar un número mínimo de personas a entrevistar, manteniendo una confianza de 95% y margen de error de 5%, se utilizó la siguiente fórmula:

\[n = Z^2p(1-p)/e^2\]

Como no hay todavía datos para obtener el valor real de p, se asume p = 0.5. Con ello, se obtiene un tamaño de muestra de por lo menos 91 personas para ser significativo.

Proveniencia de los datos

Existen varias fuentes de la que es posible extraer la información necesaria para responder las preguntas.

Nota: Todas se encuentran citadas en bibliografía.

La información contenida en estas direcciones son originales, además de confiables, dado que se presenta cada medida con su respectivo decreto legislativo. Asimismo, los datos estadísticos cuentan con sustento de fuentes oficiales.

Uso de datos

Con respecto al uso de los datos obtenidos de fuentes, tenemos claro cómo utilizar cada uno de ellos. La fuente de la que adquirimos la información respecto a las medidas tomadas nos es de mucha ayuda, ya que junto a ellas están las fechas en las que se llevaron a cabo. Esto nos permite analizar la población antes y después de que se implementarán estas medidas.

Las fuentes de las que adquirimos las gráficas de inmovilización social también nos son de gran ayuda porque nos permiten relacionar las fechas en las que se llevaron a cabo las medidas gubernamentales con el flujo de gente en las calles. Esta relación es muy importante, ya que nos permitirá analizar la efectividad de los decretos y nos ayudará a lograr nuestros objetivos. El procesamiento de la data obtenida en las fuentes es muy importante, debido a que por sí solas nos muestran información “cruda” que todo el mundo ya conoce. Al procesar esta data y relacionarla con otra/s, la investigación se vuelve más interesante, ya que las relaciones entre diferentes estadísticas son posiblemente desconocidas y le brindan información mucho más útil al lector.

Planificación

Medidas elegidas

  1. Decreto de estado de emergencia.
    • ¿Cuál fue el efecto que tuvo el decreto de estado de emergencia en la población emocionalmente? (Exploratoria)
  2. Decreto de Urgencia que dicta medidas extraordinarias con la finalidad de adquirir bienes y servicios necesarios para el alojamiento en cuarentena y alimentación de las personas que deban desplazarse dentro del país a consecuencia de la declaración del Estado de Emergencia Nacional por el COVID-19 (380)
    • ¿La cantidad de personas que se vieron beneficiadas por este decreto fue suficiente para que se reduzca considerablemente el tránsito de gente? (Inferencial)
  3. Aprueban el Padrón de los hogares en condición de pobreza o pobreza extrema beneficiarios del subsidio monetario de acuerdo al Sistema de Focalización de Hogares (SISFOH) que se encuentren en los ámbitos geográficos con mayor vulnerabilidad sanitaria en el marco del D.U. N° 027-2020 (68)
    • ¿La tasa de personas que reciben la bonificación por día fue alcanzable a la mayoría de personas del sector vulnerable? (Descriptiva)
  4. Disposición presidencial que permite la salida de hombres y mujeres en días complementarios (lunes-miércoles-viernes / martes-jueves-sábados)
    • ¿Qué diferencia hubo en el tránsito de personas entre los días para hombres y para mujeres? (Descriptiva)
    • ¿A dónde se dirige la mayor parte del flujo de personas? ¿Qué razón explicaría esto? (Exploratoria)

Preguntas propuestas para estudio (para los encuestados)

Pregunta Tipo
1 ¿Qué edad tienen los miembros de la muestra? Descriptiva
2 ¿De qué género son? Descriptiva
3 ¿Cuánto es su ingreso promedio? Descriptiva
4 ¿En qué distrito vives? Descriptiva
5 ¿Cuál fue el último nivel educativo que completaste? Descriptiva
6 ¿Su tipo de empleo es formal o informal? Descriptiva
7 ¿Qué tan frecuentemente salía de casa previamente al comienzo de la cuarentena? Descriptiva
8 ¿Qué tanto consideras que tu distrito se ha visto afectado por la enfermedad? Descriptiva
9 ¿Por qué razones salías durante la cuarentena? Descriptiva
10 ¿Consideras que esta medida “c/u de las medidas” fue efectiva para reducir el número de contagios en tu distrito? Descriptiva
11 ¿Qué condiciones crees que aceleran la propagación del Covid en tu distrito? Descriptiva
12 ¿Qué condiciones crees que retardan la propagación del Covid en tu distrito? Descriptiva
13 ¿Qué medidas gubernamentales son las que recuerdas que se hayan tomado? Descriptiva

Preguntas propuestas para estudio (para la data)

Pregunta Tipo
14 ¿Qué tanto varían las cifras de nuevos infectados durante los periodos de instauración previos-posteriores a la medida? Descriptiva
15 ¿Cuáles eran las razones por las que la población salía durante la cuarentena? Descriptiva
16 ¿Cuáles han sido las medidas que han tenido mayor impacto en la población? Descriptiva
17 Existe una misma tendencia de poblaciones afectadas por el Covid 19 durante las medidas de aislamiento? Exploratoria
18 ¿Las medidas en los distritos más exclusivos presentan una mayor o menor efectividad? Exploratoria
19 ¿La entrega de mayores subsidios monetarios resultaría en un importante beneficio para la disminución del número de salidas? Inferencial
20 ¿Es posible predecir cuántas horas en promedio una persona salía de casa conociendo su nivel de ingresos y el distrito de residencia? Predictiva
21 ¿Es posible predecir su nivel de ingresos conociendo únicamente su tipo de empleo? Predictiva
22 ¿Qué factores determinan que la propagación del Covid 19 se desacelere? Causal
23 ¿Cómo ciertas condiciones determinan que la propagación del COVID se acelere / retarde? Mecanística

Variables

Variable Relación con pregunta
Edad 1
Género 2
Clase social 3,17,18,20,21
Nivel educativo alcanzado 5,17,18
Tipo de trabajo 6,18,21
Frecuencia de salida 7,18,19
Lugar donde vive (distrito) 4,17,18,20
Cantidad de infectados por dia 14,19
Tiempo antes y despues de las medidas 14,17,18
Justificacion de salida 9,15
Medidas aplicadas 10,16,17,18,19
Factores 22,23

Descriptores numéricos para las variables de mayor importancia:

Variables Data web

  • Cantidad de personas que se movilizan en las calles antes y después de cada una de las medidas, Tiempo, Medidas aplicadas:

  • Media (valor): permitirá conocer en promedio cuántos ciudadanos limeños se movilizan antes y después de la medida

  • Mediana, cuartiles (valor): permitirá saber cuántos ciudadanos limeños se movilizan al 25%, 50%; 75%, 100% del tiempo de estudio, de esta manera se conocerá el efecto de la movilización con el transcurso del tiempo para cada medida.

  • Desviación estándar: permitirá saber cuántas son las variaciones promedio de movilización social respecto a la media

Cantidad de infectados por día, tiempo:

  • Media(valor): permitirá conocer cuánto es la tasa infectados que hubo en promedio antes y después de medida aplicada

  • Mediana, cuartiles (valor): permitirá saber cuántos infectados hubo al 25%, 50%;75%, 100% del tiempo de estudio, de esta manera se conocerá el efecto del número de infectados con el transcurso del tiempo para cada medida.

  • Desviación estándar: permitirá saber cuántas son las variaciones promedio de infectados respecto a la media.

Variables Encuestas

Frecuencia de salida promedio a la semana

  • Mediana, cuartiles (valor): permitirá saber cuántas salidas a la semana representa 25%,50%,75% de los ciudadanos de Lima encuestados para cada medida y variable de interés

  • Moda (valor): permitirá saber la frecuencia de salida mayoritaria de los ciudadanos de Lima encuestados

Tipo de trabajo

  • Frecuencia de observaciones para cada tipo de trabajo en relación a su frecuencia de salida

Edad

  • Mediana, cuartiles (valor): permitirá saber cuántas salidas a la semana representa 25%,50%,75% de los ciudadanos de Lima encuestados para cada frecuencia de salida, y cada medida

Distrito

  • Moda(valor): permitirá conocer en qué distrito inciden más en las veces de salida de las personas

Ingresos mensuales

  • Moda(valor): permitirá conocer el nivel de ingresos por cada distrito.

Género

*Frecuencia de observaciones para cada género en relación a su frecuencia de salida

Descriptores gráficos

Utilizaremos:

Gráfica de dispersión para notar fácilmente como aumenta o decrece la cantidad de infectados e infectados por dia antes y después de que se aplique la medida. Además, la gráfica de dispersión nos puede ayudar a encontrar una relación y/o patrón entre la cantidad de infectados y/o movilización social y los días transcurridos desde que se empleó cada medida.

También utilizaremos un gráfico de caja de bigotes para diferenciar las edades de los entrevistados de manera rápida y efectiva. Esto nos permitirá ver la relación entre las edades y respuestas dadas por las personas.

Además, se utilizarán gráficos de barras principalmente para visualizar y analizar las respuestas cualitativas. Con los gráficos de barras se podrán ver cuales han sido las respuestas cualitativas respondidas con más y menos frecuencia.

Finalmente, se usarán histograma para describir las variables cuantitativas que pueden ser distribuidas en rangos. Esto nos facilitará analizar los datos con muchos valores o respuestas posibles.

Plots y otras cosas

# curl -Ls "$url" > df_form.csv

tmp <- tempfile()
curl_download("https://docs.google.com/spreadsheets/d/e/2PACX-1vS5FwsKHl4PhukIHfSGbfA8NCQ5SqBDpQ16KC69JCiFAWVeJ40BACp0dqhBTkHi9cpLE_JmEmIvfdvA/pub?gid=637100843&single=true&output=csv", tmp)
read_csv(tmp) -> df_form1
Parsed with column specification:
cols(
  .default = col_character(),
  `¿Cuál es tu edad?` = col_double(),
  `¿Cuántas veces a la semana, en promedio, salías de casa durante los días de cuarentena?` = col_double(),
  `Respecto a la anterior pregunta. Del 0 al 5, ¿ En cuánto disminuyó tus salidas durante la cuarentena?` = col_double(),
  `Respecto a la anterior pregunta. Del 0 al 5, ¿Cuánto te desanimó salir de casa?` = col_double(),
  `Respecto a la anterior pregunta. Del 0 al 5, ¿Cuánto cambio tus salidas?` = col_double(),
  `Respecto a la anterior pregunta. Del 0 al 5, ¿Cuán menores fueron tus salidas?` = col_double(),
  `Respecto a la anterior pregunta. Del 0 al 5, ¿Cuánto se redujo tus salidas?` = col_double(),
  `Respecto a la anterior pregunta. Del 0 al 5, ¿ Cuán más te mantuviste en casa?` = col_double(),
  `Respecto a la anterior pregunta. Del 0 al 5, ¿Cuánto tiempo más te mantuvo en casa?` = col_double()
)
See spec(...) for full column specifications.
# Segunda encuesta
tmp <- tempfile()
curl_download("https://docs.google.com/spreadsheets/d/e/2PACX-1vS5FwsKHl4PhukIHfSGbfA8NCQ5SqBDpQ16KC69JCiFAWVeJ40BACp0dqhBTkHi9cpLE_JmEmIvfdvA/pub?gid=637100843&single=true&output=csv", tmp)

read_csv(tmp) %>%
    rename(
        tiempo = "Marca temporal",
        edad = "¿Cuál es tu edad?",
        genero = "¿De qué género eres?",
        ingreso = "¿Cuánto es el ingreso mensual promedio de tu familia aproximadamente (soles) ?",
        distrito = "¿En qué distrito vives?",
        estudio = "¿Cuál fue el último nivel educativo que completaste?",
        empleo = "¿Cuál es tu tipo de empleo?",
        salidas = "¿Cuántas veces a la semana, en promedio, salías de casa durante los días de cuarentena?",
        razones = "¿Por qué razones salías durante la cuarentena?",
        social.bool = "¿La medida de \"Inmovilización social\", realmente hizo que tus salidas durante toda la cuarentena fueran muy pocas?",
        social.05 = "Respecto a la anterior pregunta. Del 0 al 5, ¿ En cuánto disminuyó tus salidas durante la cuarentena?",
        ocio.bool = "¿ La \"Suspensión de acceso a lugares públicos: lugares de ocio, restaurantes, etc\", te desanimó salir de casa?",
        ocio.05 = "Respecto a la anterior pregunta. Del 0 al 5, ¿Cuánto te desanimó salir de casa?",
        noday.bool = "¿La medida \"Disposición salida de hombres y mujeres en días complementarios (lunes-miércoles-viernes / martes-jueves-sábados)\", garantizo que salieras menos que antes?",
        noday.05 = "Respecto a la anterior pregunta. Del 0 al 5, ¿Cuánto cambio tus salidas?",
        multa.bool = "¿ La medida \"Multa de S/.86 -S/.340 para todas las personas que desobedecen disposiciones del gobierno\", hizo que tus salidas de casa fueran menores?",
        multa.05 = "Respecto a la anterior pregunta. Del 0 al 5, ¿Cuán menores fueron tus salidas?",
        bono.bool = "¿ La medida \"Entrega de bono S/. 380, S/.760 de acuerdo al Sistema de Focalización de Hogares (SISFOH) \", permitió que redujeras tus salidas de casa?",
        bono.05 = "Respecto a la anterior pregunta. Del 0 al 5, ¿Cuánto se redujo tus salidas?",
        afp1.bool = "¿ La medida \"Retiro de hasta S/. 2000 de fondos AFP de trabajadores afiliados que no tienen planilla\", te mantuvo más tiempo en casa?",
        afp1.05 = "Respecto a la anterior pregunta. Del 0 al 5, ¿ Cuán más te mantuviste en casa?",
        afp2.bool = "¿ La medida \"Retiro del 25% de fondos AFP para trabajadores afiliados\", te mantuvo más tiempo en casa?",
        afp2.05 = "Respecto a la anterior pregunta. Del 0 al 5, ¿Cuánto tiempo más te mantuvo en casa?",
        decceleration = "¿Qué condiciones crees que existen en tu distrito que retardan la propagación del Covid?",
        acceleration = "¿Qué condiciones crees que existen en tu distrito que aceleran la propagación del Covid?"
    ) %>%
    mutate(
        genero = as.factor(genero),
        ingreso = as.factor(ingreso),
        distrito = as.factor(distrito),
        estudio = factor(estudio, levels = c("Secundaria", "Técnica", "Universitaria", "Posgrado")),
        empleo = factor(empleo, levels = c("No trabajo", "Informal", "Formal")),
        # Esteban Nicolas Villacorta Garcia cambió las respuestas de la encuesta
        # de "Mayor 5" a 6.
        salidas_ = salidas,
        salidas = replace(salidas, salidas=="6", "Mayor 5"),
        salidas = factor(salidas, levels = c(0:5, "Mayor 5")),
        razones = strsplit(razones, ", "),
        social.bool = social.bool == "Sí" | social.bool == "Si",
        ocio.bool = ocio.bool == "Sí" | ocio.bool == "Si",
        noday.bool = noday.bool == "Sí" | noday.bool == "Si",
        multa.bool = multa.bool == "Sí" | multa.bool == "Si",
        bono.bool = bono.bool == "Sí" | bono.bool == "Si",
        afp1.bool = afp1.bool == "Sí" | afp1.bool == "Si",
        afp2.bool = afp2.bool == "Sí" | afp2.bool == "Si",
        acceleration = strsplit(acceleration, ", "),
        decceleration = strsplit(decceleration, ", ")
    ) -> df_form2
Parsed with column specification:
cols(
  .default = col_character(),
  `¿Cuál es tu edad?` = col_double(),
  `¿Cuántas veces a la semana, en promedio, salías de casa durante los días de cuarentena?` = col_double(),
  `Respecto a la anterior pregunta. Del 0 al 5, ¿ En cuánto disminuyó tus salidas durante la cuarentena?` = col_double(),
  `Respecto a la anterior pregunta. Del 0 al 5, ¿Cuánto te desanimó salir de casa?` = col_double(),
  `Respecto a la anterior pregunta. Del 0 al 5, ¿Cuánto cambio tus salidas?` = col_double(),
  `Respecto a la anterior pregunta. Del 0 al 5, ¿Cuán menores fueron tus salidas?` = col_double(),
  `Respecto a la anterior pregunta. Del 0 al 5, ¿Cuánto se redujo tus salidas?` = col_double(),
  `Respecto a la anterior pregunta. Del 0 al 5, ¿ Cuán más te mantuviste en casa?` = col_double(),
  `Respecto a la anterior pregunta. Del 0 al 5, ¿Cuánto tiempo más te mantuvo en casa?` = col_double()
)
See spec(...) for full column specifications.
df_form2

Edad de la muestra

summary(df_form2$edad)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   17.0    22.0    28.0    33.4    45.0    67.0 
boxplot(df_form2$edad, xlab = "", ylab = "Edad", main=NULL)
title("Gráfico 1. Edad")

\[n = 310, sd = 12.619\]

Género

df_form2 %>%
    group_by(genero) %>%
    summarise(n = n()) %>%
    barplot(n~genero, data=., xlab="Personas", ylab="Cantidad")

title("Gráfico 2. Género")

Ingreso promedio

par(mai = c(0.8, 1.5, 0.2, 0.5))
df_form2 %>%
    group_by(ingreso) %>%
    summarise(n = n()) %>%
    barplot(n~ingreso, data=., horiz = TRUE, las = 2, xlab = "Personas", ylab="")
title(ylab="Ingreso", line=6)
title("Gráfico 3. Ingresos")

Distrito

par(mai = c(1, 2, 0.5, 0.5))
#plot(edad~distrito, data = df_form2, horizontal=TRUE, las=2, xlab="")
#title(ylab="Distrito", line=8)

df_form2$distrito %>%
    table() %>%
    sort(TRUE) %>%
    barplot(horiz = TRUE, las = 2, xlab = "Personas", ylab="")
title("Gráfico 4. Distrito")

Empleo

par(mai = c(1, 1.5, 0.5, 0.5))
df_form2$empleo %>%
    table() %>%
    sort(TRUE) %>%
    barplot(horiz = TRUE, las = 2, xlab = "Personas", ylab="")

title("Gráfico 5. Tipo de trabajo")

¿Qué tanto varían las cifras de nuevos infectados durante los periodos de instauración previos-posteriores a la medida?

Para esta primera pregunta se han procesado los datos web. Se presentarán dos gráficos por cada una de las cuatro medidas que se analizarán. El primero de ellos será de los nuevos casos y el segundo de la movilización recreacional (cambios en la movilización). Los descriptores que se están utilizando para describir mejor los datos obtenidos es la media y mediana. Es necesario destacar que se ha optado por graficar los datos diez días antes de que se decrete la medida y diez días después de haberse promulgado.

Frecuencia de salidas VS ingresos

ggplot(aes(x = salidas_, y = ingreso), data = df_form2) +
    geom_boxplot() +
    ggtitle("Salidas vs ingresos") +
    theme(plot.title = element_text(hjust = 0.5))

Declaración del Estado de Emergencia

En esta gráfica podemos visualizar que la cantidad de infectados por día bajó en algunos días inmediatamente después de que se declarará el estado de emergencia. Se puede apreciar en la gráfica que se lleva a cabo cada 2 o 3 días durante la semana siguiente a la implementación del Estado de Emergencia. Esto se podría deber a factores como la cantidad de pruebas tomadas por día, frecuencia de salida de las personas y el cumplimiento de las leyes y medidas tomadas.

Nuevos casos 03-05 -> 03-25

plot_new_cases("2020-03-05", "2020-03-25")

.

Para analizar esta gráfica, se asume que el crecimiento de la enfermedad bajo condiciones normales es exponencial. Por tanto, se puede construir un modelo tal que: ln(y) ~ At+B. Tomando a L1 como regresión de control sin variable independiente y L2 la regresión luego de aplicarse la medida, se realizó un F-test para comprobar si el modelo L1 modela a L2 sin diferencias significativas.

  • Ho : No existen diferencias significativas entre ambos modelos.
  • Ha : Existen diferencias significativas entre el modelo anterior a la medida y el actual.
F - Test Two - Sample for Variances
Variable 1 Variable 2
———- ——
Mean 1.55950355 3.603577946
Variance 1.30751423 0.201678854
Observations 10 9
df 9 8
F 6.48314984
P (F <= f) one-tail 0.00746629
F crítico one-tail 3.38813023
———- ——

Dado que la varianza 1 > varianza 2, la elección del orden de las variables es correcta. Por tanto, dado F > F crítico, se encuentra evidencia para falsear Ho. Dado α > P(F<=f) una cola, se rechaza la hipótesis nula, por lo que existen diferencias significativas. Comparando las pendientes A1=0.337 y A2=0.0729 con A2 <A1, se puede asumir que se frenó la expansión de la enfermedad.

Movilización recreacional 03-05 -> 03-25

plot_rmoves("2020-03-05", "2020-03-25")

.

A partir del gráfico 7, se logra visualizar que previo a la promulgación de la medida “Declaración de Estado de Emergencia”, la gente tenía mucha más movilización y luego de decretada, el cambio de movilización disminuyó en gran medida. El promedio y mediana (líneas continuas) antes de que se aplique esta medida es aproximadamente -3. Por otro lado, el promedio y mediana (líneas punteadas) desde el quince hasta el veinticinco está por debajo de -60.

Para comprobar la significancia de esta diferencia, se realizó un test-t de medias. Se asumieron las siguientes hipótesis:

  • Ho : No existe un efecto significativo de la medida por sobre las medias del Cambio de Movilización.
  • Ha : Existen diferencias significativas entre las medias de la variable Cambio de Movilización para antes y después de ejecutarse la medida.
t - Test Two Assuming Unequal Variances
Variable 1 Variable 2
———- ——
Mean -3.363636364 -71.1818182
Variance 15.65454545 113.363636
Observations 11 11
df 13
t Stat 19.8023634
P (T <= t) one-tail 2.15261E-11
t crítical one-tail 1.770933396
P (T <= t) two-tail 4.30521E-11
t crítical two-tail 2.160368656
———- ——

Dado que el valor |t| > t-crítico dos colas, se puede encontrar evidencia para rechazar la hipótesis nula Ho. Dado α =0.05 > P(T<=t) dos colas, existe significancia suficiente para ello. Por tanto, se rechaza Ho, existiendo por tanto diferencias significativas entre antes de ejecutarse la declaración de Estado de Emergencia y después sobre la movilización de las personas. Debido a que el coeficiente de correlación es menor a 0, se puede afirmar que el cambio además redujo la movilización.

Aprobación del Padrón de Hogares

Este gráfico nos muestra la cantidad de casos diez días antes y diez días después de que la medida “Aprobación del Padrón de Hogares” fuera aprobada. Esta es una gráfica muy importante, dado que tenía como objetivo ayudar a las poblaciones más vulnerables en condición de extrema pobreza a nivel nacional para que pudieran subsistir durante la cuarentena. Dicho en otras palabras, para que pudieran acceder a los servicios básicos y medicamentos, en caso fuesen requeridos. La cantidad de casos antes de que la medida fuese declarada, 08/03 hasta 18/03, va desde aproximadamente uno hasta veinte. No obstante, desde 18/03 hasta 28/03 la cantidad de casos va en aumento. Sin duda alguna, el objetivo era bueno, pero para el panorama que se estaba viviendo no fue efectiva. Una posible hipótesis sería la salida obligatoria de los beneficiarios a los bancos a formar largas colas durante horas. Esto explicaría el aumento de casos.

Nuevos casos 03-08 -> 03-28

plot_new_cases("2020-03-08", "2020-03-28")

.

Se realizó un f-test sobre los inputs a la regresión lineal del logaritmo de la gráfica, siguiendo el modelo planteado arriba. Se colocó como control a todos los datos previos a declararse la medida. Se plantearon las siguientes hipótesis:

  • Ho : No existe un efecto significativo de la medida por sobre la tendencia de los nuevos casos con respecto al control.
  • Ha : Existen un efecto significativo entre las muestras de control y la data posterior a la declaración.
F - Test Two - Sample for Variances
Variable 1 Variable 2
———- ——
Mean 1.538879 3.218122
Variance 0.949329 0.148907
Observations 10 10
df 9 9
F 6.375321
P (F <= f) one-tail 0.008398
F crítico one-tail 3.438101
———- ——

Dado que la primera varianza es mayor a la segunda, el orden de operación de los datos es correcto. Como tal, dado F > F-critico una cola, encontramos evidencia en contra de Ho. Dado ademas P(F<=f) < α , se puede garantizar la decisión de rechazar la hipótesis nula, por lo que deben existir diferencias significativas entre los datos. Dado además A1= 0.2672 > A2=0.0116, se puede afirmar que la medida redujo la tasa de infección.

Movilización recreacional 03-08 -> 03-28

plot_rmoves("2020-03-08", "2020-03-28")

.

Esta gráfica, al igual que la Gráfica 7, manifiesta un comportamiento similar. Sin embargo, a partir de la disminución de la curva se podrían generar algunas conjeturas. La primera de ellas es que las personas tenían un respaldo para poder comprar sus alimentos y medicamentos de ser necesario por lo que ya no tenían que salir a las calles de manera concurrida a vender productos, entre otras cosas. Cabe resaltar que con esto no queremos decir que la población no salía y que la medida fue 100% efectiva. Al contrario, la población objetivo salió para hacer el retiro del subsidio por lo que el número de casos aumentó. Sin embargo, esto también contribuyó a que en días posteriores se queden en casa, debido a que contaban con dinero para subsistir por un par de semanas más (varía según el número de integrantes). Estas afirmaciones se respaldan con la media y mediana antes del decreto (líneas continuas), dado que se ubica en la parte superior del gráfico, mientras que la media y mediana (líneas punteadas) por debajo de -60.

Utilizando un test-t para medias en ambas secciones de la gráfica, podemos determinar si existe un efecto de la medida por sobre la trend general.

  • Ho : No existen diferencias significativas entre ambas secciones de la gráfica.
  • Ha : Existen diferencias significativas entre ambas secciones de la gráfica.
t - Test Two Sample Assuming Unequal Variances
Variable 1 Variable 2
———- ——
Mean -9.33333333 -74.5
Variance 135 5.388888889
Observations 9 10
Hypothesized Mean Difference 0
df 9
t Stat 16.53162428
P(T <= t) one - tail 2.41781E-08
t Critical one - tail 1.833112933
P(T <= t) two - tail 4.83563E-08
t Critical two - tail 2.262157163
———- ——

Dado que el estadístico |t| > t-crítico dos colas, se encuentra evidencia para falsear la hipótesis nula. Dado que P(T<=t) < α, la elección es justificable, por lo que se rechaza la hipótesis nula, concluyendo por tanto que existe una diferencia significativa entre ambas secciones de la gráfica. Debido a que la correlación es negativa, se concluye que la medida redujo la movilizacion recreacional.

Salida alternada por género

El gráfico 10 exhibe la cantidad de casos antes y después de aplicarse la medida “Salida alternada por género”. En un primer momento esta medida tenía como objetivo disminuir el número de contagios. Por tal razón, el Gobierno decretó determinados días de salida para mujeres y otros para varones, y los domingos nadie salía. No obstante, a partir de la representación se puede observar que el número de casos aumentó de aproximadamente cien a mil cien casos. Después de los reportajes vistos, podríamos tratar de explicar este comportamiento basándonos en lo siguiente: las mamás consideran que los varones (esposos) no saben hacer las compras de mercado. Algunos dirían que esto no tiene fundamento, pero analizando detalladamente los reportajes, pudimos reconocer que en los días de salida de mujeres había mucha más aglomeración y desorden, a diferencia de los días en que les tocaba salir a los varones.

Nuevos casos 03-24 -> 04-13

plot_new_cases("2020-03-24", "2020-04-13")

.

Para comprobar estadísticamente si es que la medida fue efectiva o no, se realizó el test F sobre la forma logarítmica de la regresión. Debido a que la regresión no se centra en 0, se normalizaron los puntos previamente.

  • Ho : No existe diferencias significativas entre los dos sets de puntos.
  • Ha : Existe diferencias significativas entre el set de puntos antes y despues de aplicarse la medida.
F - Test Two - Sample for Variances
4.15888 6.71296
———- ——
Mean 4.820939 6.666542
Variance 0.366808 0.140169
Observations 10 6
df 9 5
F 2.616901
P (F <= f) one-tail 0.150944
F crítico one-tail 4.772466
———- ——

Dado que F < F-crítico una cola, no se puede falsear la hipótesis nula. Además, comoP(F<=f) una cola > 0.05, se decide mantener la hipótesis nula, considerando que no existen diferencias significativas. Con esto, se comprueba que la medida no tuvo éxito en reducir los nuevos casos.

Movilización recreacional 03-24 -> 04-13

plot_rmoves("2020-03-24", "2020-04-13")

.

Se puede observar un leve cambio en la posición de las medias de ambos datasets. Para comprobar la significancia de esta diferencia, se plantea un test-t. Asumiendo:

  • Ho: No se puede encontrar diferencias significativas entre las dos fases.

  • Ha: Existen diferencias significativas entre antes de declararse la medida y tras su ejecución.

t - Test: Paired Two Sample for Means
-75 -76
———- ——
Mean -74.1111 -85.3333
Variance 0.923611 69
Observations 9 9
Pearson Correlation -0.68635
Hypothesized Mean Difference 8
df 8
t Stat 1.074858
P(T <= t) one - tail 0.156892
t Critical one - tail 1.859548
P(T <= t) two - tail 0.313784
t Critical two - tail 2.306004
———- ——

Dado que |tStat| < t critico dos colas, no se puede encontrar evidencia que niegue Ho. Dado además que P(T<=t) > α, no se llega a rechazar la hipótesis nula, por lo que se asume que no existen diferencias significativas tras la medida.

A partir de este gráfico se puede observar una similitud en el comportamiento con todos los demás analizados hasta este punto. Si bien es cierto las tres medidas funcionan bien para disminuir la movilización, pero con el nivel de casos de Covid-19 sucede lo contrario, dado que estos aumentan de manera significativa. Es necesario destacar que hay fechas en las que disminuye y otras en las que aumenta. No obstante, un cambio notorio sucede a partir del 6 de abril, donde la movilización está por debajo de -90 aproximadamente. El cambio de movilización puede estar fundamentada porque parte de la población no salía el mismo día. Pero, si disminuyó la movilización ¿por qué aumentaron los casos? Para responder esta pregunta, nos basaremos en el gráfico anterior, donde objetamos que las madres no pueden dejar el control o confianza a sus esposos para que se encarguen de la dispensa. La mayoría optaba por salir a comprar un día hábil y la misma aglomeración, desorden y el no distanciamiento contribuye a la aceleración de la propagación del virus.

Permiso de adquisición de bienes y servicios básicos

En el gráfico número 12 hay una observación muy poco evidente que se puede ver. Pocos días anteriores a la implementación de la medida en consideración, los nuevos casos empezaron a incrementar después de haberse mantenido relativamente constantes por un tiempo. El incremento de estos nuevos casos al parecer fue controlado por unos dias posteriores de ser tomada la medida. Sin embargo, en la gráfica se puede visualizar que aproximadamente una semana después de haberse tomado esta medida los casos empezaron a incrementar nuevamente.

Nuevos casos 04-10 -> 04-30

plot_new_cases("2020-04-10", "2020-04-30")

.

Para comprobar la significancia de esta diferencia, se plantea un test-f. Asumiendo a los puntos ubicados antes de la aplicación de la medida como control:

  • Ho: No se puede encontrar diferencias significativas entre la fase de control y tras aplicar la medida.

  • Ha: Existen diferencias significativas entre antes de declararse la medida y tras su ejecución.

F - Test Two - Sample for Variances
0 0.68434
———- ——
Mean 0.162215 0.865875
Variance 0.079739 0.076307
Observations 9 9
df 8 8
F 1.044967
P (F <= f) one-tail 0.475961
F crítico one-tail 3.438101
———- ——

Dado F < F-crítico una cola, no se encuentra evidencia en contra de la hipótesis nula. Como P(F<=f)>0.05, no se rechaza Ho, asumiendo por tanto que no existen diferencias significativas en el ratio de aparición de nuevos casos.

Movilización recreacional 04-10 -> 04-30

plot_rmoves("2020-04-10", "2020-04-30")

.

En esta gráfica podemos ver que la medida de permiso de adquisición de bienes y servicios básicos no afectó de manera evidente la movilización social, ya que no se puede ver una reducción o incremento totalmente claro en los días posteriores a la implementación de esta medida. Se puede observar esto mediante un t-test. Asumiendo así:

  • Ho = No existe diferencia antes y después de aplicarse la medida

  • Ha = Existen diferencias significativas en la movilización entre el periodo previo a la declaración y el posterior.

t - Test: Paired Two Sample for Means
-69 -93
———- ——
Mean -76.7381 -78.9556
Variance 44.18367 58.21778
Observations 9 9
Pooled 51.20073
Hypothesized Mean Difference 8
df 8
t Stat -1.7143
P(T <= t) one - tail 0.052888
t Critical one - tail 1.745884
P(T <= t) two - tail 0.105775
t Critical two - tail 2.119905
———- ——

Dado que |t| < t-crítico, no se puede solventar la idea de rechazar la hipótesis directamente. Dado además que P(T<t) > α , no se llega a rechazar completamente Ho, por lo que se asume que no existen diferencias significativas.

¿Cuáles eran las razones por las que la población salía durante la cuarentena?

Razones

df_form2$razones %>% unlist() %>% table() -> razones_t
wordcloud(names(razones_t), as.vector(razones_t), min.freq = 2)

title("Gráfico 14. Razones para salir durante la cuarentena")

El gráfico anterior manifiesta algunas de las razones que justifican las salidas de casa de la población encuestada durante la cuarentena. Es necesario destacar que esta gráfica se relaciona mucho con la gráfica 6,8,10 y 12, dado que explicaría de algún u otro modo el aumento de casos. La razón con mayor porcentaje es la comida, la que le continúa son los medicamentos y por último el trabajo.

Frecuencia de salida

df_form2 %>%
    group_by(salidas) %>%
    summarise(n=n()) %>%
    barplot(n~salidas, data=., ylab = "Personas", xlab="Salidas")

title("Gráfico 15. Salidas por semana")

Este gráfico se relaciona mucho con el anterior, dado que exhibe las salidas por semana de la población muestra. La gráfica contiene un punto máximo en 2, además de otro máximo local en 5. La media y la mediana son 3.06 y 3 respectivamente, lo que provee un buen estimador de las salidas promedio de las personas encuestadas.

Frecuencia de salida VS Ingresos

ggplot(aes(x =salidas_, y = ingreso, group=ingreso), data = df_form2) +
    geom_boxplot() +
    ggtitle("Salidas vs ingresos") +
    theme(plot.title = element_text(hjust = 0.5))

Para el rango más bajo de ingresos [0-1000] soles, de acuerdo a la caja de bigotes, se obtuvo una mediana de 2 en la frecuencia de salida. Esto evidencia que casi el 50% incide en salir menos de 2 veces y el otro 50% sale más de 2 veces. Para el rango más alto de ingresos [>10000] la mediana es 3. Ello representa que el 50% incide en salir más de 3 veces. Los ingresos entre ambos rangos muestran una frecuencia de salida menor, la cual favorece en mediana a salidas menores que 3 y 2. A medida que incrementan los ingresos no se evidencia un comportamiento definido para las frecuencias de salida, pero si un favorecimiento a menores salidas que el rango más bajo de ingresos. La única excepción se da para el rango más alto de ingresos.

ggplot(aes(x=salidas_, y=ingreso, group=salidas_), data = df_form2) +geom_count()

Esta segunda gráfica muestra la cantidad de observaciones por ingreso y frecuencia de salida. Se observa que para 0 salidas , a medida que aumentan los ingresos menos personas inciden en esta. El mismo comportamiento se da para 1 salida, 5 salidas. Es similar el comportamiento para 2,3,6 salidas solo que existen variaciones más notorias. Asimismo, se muestra que los rangos más bajos de ingresos [0,1000],[1000,2000) presentan mayor cantidad de observaciones de 0 a 6 salidas.

#Frecuencia de salida vs. Edad

ggplot(aes(x = salidas_, y = edad, group = salidas_), data = df_form2) + geom_boxplot() +  ggtitle("Salidas vs edad") + theme(plot.title = element_text(hjust = 0.5))

Esta gráfica muestra que las medianas de las edades cambian ligeramente con la frecuencia de salida. Para 0 salidas hay personas 18-32 años que abarcan 25% y 75% del total. Para 1 salida existen personas con más edad de 25- 45 años que ocupan el rango intercuartílico. Para 2,3 salidas se mantiene ese rango de edades y la mediana cambia casi nada. Para 5,6 salidas la mediana no aumenta ni disminuye significativamente. Un aumento de la mediana a medida que aumenta la frecuencia de salida implicaria que en cada frecuencia de salida casi el 50% lo ocupen personas de más edad que la anterior frecuencia de salida. Dado que no sucede esto, se evidencian distribuciones algo similares.

ggplot(aes(y = salidas_, x = genero, group = genero), data = df_form2 ) + geom_count() +  ggtitle("Género vs salidas") + theme(plot.title = element_text(hjust = 0.5))

La gráfica muestra que las observaciones son mayores para el género masculino. Los hombres, entre 1-3 salidas inciden más, las mujeres de igual forma inciden más en 1-3 salidas. Para las mujeres, la cantidad de observaciones incrementa de 0-1 salida, entre 1-3 salidas la cantidad de observaciones es la misma , luego a medida que incrementan las salidas la cantidad de observaciones disminuye. Para los hombres, la cantidad de observaciones incrementa entre 0-2 salidas, luego a medida que aumentan las salidas, la cantidad disminuye y vuelve a aumentar. Existe mayor dispersión para más de 3 salidas.

ggplot(aes(y = salidas_, x = empleo, group = empleo), data = df_form2 ) + geom_count() +  ggtitle("Tipo_trabajo vs salidas") + theme(plot.title = element_text(hjust = 0.5))

La cantidad de observaciones es mayor para las personas con un trabajo formal. Estas tienen mayor variación en la cantidad de observaciones a medida que aumentan las salidas. Para las personas con un trabajo informal, existe una menor variación en la cantidad de observaciones.

¿Cuáles han sido las medidas que han tenido mayor impacto en la población?

Medidas

par(mai = c(1, 2.5, 0.5, 0.5))

(table(c(
    rep("Inmovilización",               length(which(df_form2$social.bool))),
    rep("No acceso a lugares públicos", length(which(df_form2$ocio.bool))),
    rep("Salida intercalada",           length(which(df_form2$noday.bool))),
    rep("Bono",                         length(which(df_form2$bono.bool))),
    rep("Un monto del Afp",             length(which(df_form2$afp1.bool))),
    rep("Un porcentaje del Afp",        length(which(df_form2$afp2.bool)))
))/length(df_form2$social.bool)) %>%
    sort(TRUE) %>%
    barplot(horiz = TRUE,
            las = 1,
            ylab = "",
            xlab = "Aprobación"
    )
title("Gráfico 16. Aprobación por medida (de 0 a 1)")

El gráfico 16 muestra el nivel de aprobación de las medidas que se están estudiando. No obstante, también se han incluido dentro del padrón de hogares el monto de AFP y un porcentaje del mismo. Con un nivel de aprobación mayor a 0.8, la población optó por la medida “Declaración de Estado de Emergencia”. Desde el punto de vista de la población la inmovilización contribuyó en mayor medida. El segundo lugar es para el no acceso a lugares públicos, es decir el permiso para la adquisición de bienes y servicios básicos. Luego, con una aprobación menor a 0.6 las salidas por género. Finalmente, la aprobación del Padrón de Hogares con una aprobación de 0.2 aproximadamente.

Respondiendo las preguntas exploratorias

¿Existe una misma tendencia de poblaciones afectadas por el Covid 19 durante las medidas de aislamiento?

El gráfico 17 muestra la relación entre las variables clase social y distrito. Una parte de la población se distribuyó entre los distritos Barranco con 3000 a 4000 soles de ingresos mensuales, Santiago de Surco [6000-7000), Surquillo [7000-8000) y Villa María del Triunfo [5000-6000). No obstante, la mayor parte de la población se ubica en un nivel de ingreso entre 0 a 2000. En el gráfico 18 se muestra el número de casos por distrito. Estos resultados se pueden vincular directamente con los ingresos de la población. En el gráfico 17 analizamos los distritos que tienen una mayor distribución en un ingreso específico. Por ejemplo, en el gráfico 18. el distrito de Barranco tiene un número de casos menor a 2000 mil casos. Surquillo por su parte tiene aproximadamente 2100 casos. Más aún, Santiago de Surco 5000 casos y Villa María del Triunfo 5800 casos. A partir de ello podríamos establecer ciertos patrones. El primero de ellos sería que para las poblaciones de un estatus social solvente (ingresos mayores a 4000) y que este sea de un determinado distrito presentará un menor número de contagiados. Esto se cumple para Barranco, Surquillo y Santiago de Surco. No obstante, si nos dirigimos a analizar determinadas poblaciones donde el número de infectados es elevado y nos fijamos en el ingreso promedio podemos dar cuenta que la mayor parte oscila entre cero a mil soles mensuales. Basta para ilustrar, Comas, distrito que tiene un ingreso de cero a mil y cuyo número de casos asciende a casi 9000.

Distrito vs ingreso

# No supe como hacerlo con vanilla R
ggplot(aes(y = distrito, x = ingreso), data = df_form2) +
    geom_boxplot() +
    ggtitle("Gráfico 17. Distritos vs ingresos") +
    theme(plot.title = element_text(hjust = 0.5))

Casos por distrito

par(mai = c(1, 2.5, 1, 0.5))
df %>% filter(PROVINCIA == "LIMA") %>%
    select(DISTRITO) %>%
    table() %>%
    sort(TRUE) %>%
    barplot(las=1, horiz=TRUE, xlab="Casos")
title("Gráfico 18. Casos por distrito")

¿Las medidas en los distritos más exclusivos presentan una mayor o menor efectividad?

Las medidas presentan una mayor efectividad en el distrito de Barranco, dado que a diferencia de los demás, su número oscila en aproximadamente 900 casos. El mayor número de casos es en Santiago de Surco, con más de 4000 mil casos. Analizando, la gráfica 20, la cual relaciona empleo VS. Distrito se puede constatar que en Barranco existe mayor cantidad de gente con un empleo informal. Cabe señalar que también hay población que no trabaja. Por otro lado, en Santiago de Surco, San Isidro y San Borja existe una empleabilidad formal. Un patrón muy interesante es que los distritos que presentan una empleabilidad formal tiene una mayor cantidad de ingresos. Basta para ilustrar, Barranco tiene un ingreso de alrededor de 4000 soles con una empleabilidad informal, mientras que los tres restantes tienen un ingreso mayor a 8000 soles con un tipo de empleo formal.

Distrito exclusivos vs casos

par(mai = c(1, 2, 0.2, 0.5))
df %>% filter(PROVINCIA == "LIMA") %>%
    filter(DISTRITO %in% c("MIRAFLORES",
                           "BARRANCO",
                           "SAN ISIDRO",
                           "SANTIAGO DE SURCO",
                           "SAN BORJA")
           ) -> infectados_5 # Es necesario luego

infectados_5 %>%
    select(DISTRITO) %>%
    table() %>%
    sort(TRUE) %>%
    barplot(las=1, horiz=TRUE, xlab="Casos")
title("Gráfico 19. Casos en algunos distritos")

Distrito exclusivos vs empleo

df_form2 %>%
    filter(distrito %in% c("Miraflores",
                           "Barranco",
                           "San Isidro",
                           "Santiago de Surco",
                           "San Borja")
           ) -> df_5
ggplot(aes(y = distrito, x = empleo), data = df_5) +
    geom_boxplot() +
    ggtitle("Gráfico 20. distritos vs tipo de empleo")

Distrito exclusivo vs ingreso

ggplot(aes(y = distrito, x = ingreso), data = df_5) +
    geom_boxplot() +
    ggtitle("Gráfico 21. distritos vs ingresos") # Aún no ha respondido nadie de Miraflores.

Respondiendo las preguntas inferenciales

¿La entrega de mayores subsidios monetarios resultaría en un importante beneficio para la disminución del número de salidas?

A partir del gráfico 22 se manifiesta que esta medida, para la población encuestada, no redujo las salidas. Esto respalda las hipótesis que suscitaron en la gráfica 8 y 9, las cuales exponían que aunque el objetivo del padrón de hogares era ayudar a las poblaciones más vulnerables para que puedan acceder a los servicios básicos, el mismo hecho de cobrar hacía que la salidas aumenten. Del mismo modo, la aglomeración resultaría en un aumento del número de contagiados, el cual se muestra claramente en la gráfica 8.

Entrega de bono S/. 380, S/.760 de acuerdo al Sistema de Focalización de Hogares (SISFOH)

df_form2$bono.05 %>%
    table() %>%
    barplot(ylab="Personas")

title("Gráfico 22. Reducción de salidas (0 - 5)")

Disminución de salidas de las demás medidas

Inmovilización

df_form2$social.05 %>%
    table() %>%
    barplot(ylab="Personas")

title("De 0 a 5, ¿Cúanto disminuyeron tus salidas durante la cuarentena?")

Suspensión de acceso a lugares públicos

df_form2$ocio.05 %>%
    table() %>%
    barplot(ylab="Personas")

title("De 0 a 5, ¿Cúanto disminuyeron tus salidas durante la cuarentena?")

Disposición salida de hombres y mujeres en días complementarios

df_form2$noday.05 %>%
    table() %>%
    barplot(ylab="Personas")

title("Del 0 al 5, ¿Cuánto cambió tus salidas?")

Respondiendo las preguntas predictivas

¿Es posible predecir cuántas horas en promedio una persona salía de casa conociendo su nivel de ingresos y el distrito de residencia?

Para esta pregunta, utilizaremos la gráfica 17 para tratar de darle respuesta. Como ya se analizó previamente, esta gráfica exhibe que tres de los cincos distritos exclusivos de Lima tienen un ingreso entre 3000 y 8000 soles. Sin embargo en distritos como Ate Vitarte, Cieneguilla, El Augustino, Independencia, Lurín, entre otros, el nivel de ingresos es desde 1000 a 2000 soles. En base a estos datos, podríamos predecir que las personas con mayores ingresos son las que menos horas salen de casa, mientras que las personas que no tienen una buena solvencia económica requerirían y se verían en la obligación de salir de casa para poder conseguir dinero, ya sea vendiendo productos de primera necesidad, ropa, accesorios, etc.

¿Es posible predecir su nivel de ingresos conociendo únicamente su tipo de empleo?

Después de realizar una investigación, se pudo encontrar que las personas con un empleo informal ganan en promedio S/. 715. La ministra de Trabajo, Sylvia Cáceres mencionó que en contraste con la población en el sector formal perciben un salario promedio de más de S/. 2000. Es necesario destacar que la variabilidad dependerá del tipo de trabajo. También la ministra mencionó que la brecha es de un 64%. Para el gráfico 18, una mayor población se encuentra trabajando en un sector formal, por lo que sus ingresos oscilarían entre S/.2000 a más. Por otro lado, el sector informal es el que menos población presenta, menor a quince personas aproximadamente. Esta población, según lo citado, tendrá un salario tres veces menor al del sector formal.

Empleo

par(mai = c(1, 1.5, 0.5, 0.5))
df_form2$empleo %>%
    table() %>%
    sort(TRUE) %>%
    barplot(horiz = TRUE, las = 2, xlab = "Personas", ylab="")

title("Gráfico 23. Tipo de trabajo")

Respondiendo las preguntas causales

¿Qué factores determinan que la propagación del Covid 19 se desacelere?

Desaceleración del contagio

df_form2$decceleration %>%
    unlist() %>%
    table() %>%
    sort(TRUE) %>%
    knitr::kable(col.names = c("Medida", "Personas que lo aprueban"))
Medida Personas que lo aprueban
Toque de queda 204
Aplicación de medidas preventivas sanitarias 198
Inmovilización 192
Que la mayoría de la movilización es por vehículos particulares por suerte 15

Respondiendo las preguntas mecanísticas

¿Cómo ciertas condiciones determinan que la propagación del COVID se acelere?

Aceleración del contagio

df_form2$acceleration %>%
    unlist() %>%
    table() %>%
    sort(TRUE) %>%
    knitr::kable(col.names = c("Factor", "Personas que lo aprueban"))
Factor Personas que lo aprueban
Aglomeración de personas 176
Falta de educación 167
Informalidad 164
No acatar las medidas de prevención sanitaria 144
Desinformación 93
Sistema de salud 89
Fue una gestión adecuada en mi opinión 17
La alta densidad poblacional preexistente causa que no sirva de tanto el confinamiento ya que de todas maneras una casa en promedio alberga 10+ personas 15

Discusión de resultados

Patrones:

  1. Pudimos notar que la curva de casos totales muestra un crecimiento continuo en el tiempo, evidenciándose un cambio no significativo entre antes y después de haber tomado cada medida.

  2. En cuanto a los nuevos casos por día pudimos notar que todas las gráficas muestran una variación considerable en la cantidad de casos diarios pocos días después de que se aplicara cada medida. Estas variaciones se ven como datos atípicos en las gráficas.

  3. En las gráficas de movilización social si se puede ver claramente el efecto de las medidas respectivas en ellas. El estado de emergencia hizo que la movilización social disminuyera en gran medida y la norma de salir días específicos de la semana también tuvo un impacto en la movilización ciertos días de la semana.

  4. Asimismo, otro patrón encontrado es que para las poblaciones de un estatus social solvente (ingresos mayores a 4000) y este siendo de un determinado distrito presenta un menor número de contagiados. Esto se cumple para Barranco, Surquillo y Santiago de Surco. No obstante, si nos dirigimos a analizar determinadas poblaciones donde el número de infectados es elevado y nos fijamos en el ingreso promedio podemos dar cuenta que la mayor parte oscila entre cero a mil soles mensuales. Basta para ilustrar, Comas, distrito que tiene un ingreso de cero a mil y cuyo número de casos asciende a casi 9000.

  5. Un patrón muy interesante es que los distritos que presentan una empleabilidad formal tiene una mayor cantidad de ingresos. Basta para ilustrar, Barranco tiene un ingreso de alrededor de 4000 soles con una empleabilidad informal, mientras que los tres restantes tienen un ingreso mayor a 8000 soles con un tipo de empleo formal.

  6. Se observó que la mayoría de veces, los ingresos mensuales más altos favorecían a menores frecuencias de salida que la mediana en salidas del rango más bajo de ingresos.

  7. Se observó que la mediana de las edades no cambió mucho a medida que aumentaban las frecuencias de salida. Las distribuciones de las edades para cada frecuencia de salida no resultaron muy diferentes. Sin embargo, parecía que personas con menor edad a 25 años tenían menores frecuencias de salida.

  8. Se observó que la cantidad de observaciones por género, tipo de trabajo resultan dispersas para cada aumento en la frecuencia de salida. Sin embargo, los hombres parecían ser favorecidos a tener una mayor incidencia en la frecuencia de salida, no se muestra un comportamiento definido.

Hipótesis, relación movilidad social-> casos covid-19:

Hipótesis, en relación a las encuestas:

    1. H0: Las personas con menores frecuencias de salida no necesariamente tienen ingresos mensuales mayores a 1000 soles. HI:Las personas con menores frecuencias de salida tienen ingresos mensuales mayores que 1000 soles.
    1. H0: las personas con menor edad de 25 años no necesariamente tienen menores frecuencias de salida HI: las personas con menor edad de 25 años tienen menores frecuencias de salida
    1. H0: las personas de genero masculino no necesariamente tienen mayores frecuencias de salida HI: las persoanas de genero masuculino tienen mayores frecuencias de salida

Parámetros de estudio

A partir de los datos obtenidos de las encuesta, se establecen parámetros de interés que permiten cuantificar la confiabilidad del estudio realizado:

Población Tamaño de la muestra (personas entrevistadas) Significancia (α)
8000000 360 5%

#Intervalos de confianza para la media de variables cuantitativas de encuesta

# Intervalos de confianza para la media de la variable Frecuencia_salida_por_Semana
n=length(df_form2$salidas_)
yn=mean(df_form2$salidas_)

esn=sd(df_form2$salidas_)/sqrt(n)
alfa=0.05
parametro_estadistico=qnorm(alfa/2,lower.tail = FALSE)
lim_inferior=yn-parametro_estadistico*esn
lim_superior=yn+parametro_estadistico*esn
round(lim_superior,2)
[1] 2.67
round(lim_inferior,2)
[1] 2.32
round(parametro_estadistico*esn,2)
[1] 0.17

\[ l.superior , l.inferior=yn(+/-) parametro.estadistico*esn\] \[ l.superior= 2.67, l.inferior=2.32\]

# Intervalos de confianza para la media de la variable edad
n=length(df_form2$edad)
alfa=0.05
yn2=mean(df_form2$edad)
esn2=sd(df_form2$edad)/sqrt(n)
parametro_estadistico2=qnorm(alfa/2,lower.tail = FALSE)
lim_inferior=yn2-parametro_estadistico2*esn2
lim_superior=yn2+parametro_estadistico2*esn2
round(lim_superior,2)
[1] 34.77
round(lim_inferior,2)
[1] 32.03
round(parametro_estadistico2*esn2,2)
[1] 1.37

\[ l.superior , l.inferior=yn2(+/-) parametro.estadistico2*esn2\] \[ l.superior= 34.77, l.inferior=32.03\]

(1000 * (as.numeric(df_form2$ingreso) - 1)) -> ingresos

# Intervalos de confianza para la media de la variable ingreso
n=length(df_form2$ingreso)
alfa=0.05
yn3=mean(ingresos)
esn3=sd(ingresos)/sqrt(n)
parametro_estadistico3=qnorm(alfa/2,lower.tail = FALSE)
lim_inferior=yn3-parametro_estadistico3*esn3
lim_superior=yn3+parametro_estadistico3*esn3
round(lim_superior,2)
[1] 2674.45
round(lim_inferior,2)
[1] 2064.44
round(parametro_estadistico3*esn3,2)
[1] 305.01

\[ l.superior , l.inferior=yn3(+/-) parametro.estadistico3*esn3\] \[ l.superior= 2674.45, l.inferior=2064.44\]

Valores de interés

Variables cuantitativas Rango Media
Edad [17,67] 39.8
Frecuencia de salida por semana [0,6] 2.5
Ingreso [0,9000] 2369

Conocer los intervalos de confianza para la media de la edad, permite saber con una confianza del 95% qué tan cerca están las edades en promedio con el valor esperado de la distribución normal. Esto significa que el intervalo de edades en la muestra, entre 38-40 años representan el 95% de confianza para la media. Respecto a la frecuencia de salida, ya que el intervalo de confianza de la media es muy pequeño indica que durante cada una de las medidas aplicadas la mayoría de personas entrevistadas salieron 2 veces a la semana.

Pruebas de Hipótesis:

Hipótesis, en relación a las encuestas:

    1. H0: Las personas con menores frecuencias de salida no necesariamente tienen ingresos mensuales mayores a 1000 soles. HI:Las personas con menores frecuencias de salida tienen ingresos mensuales mayores que 1000 soles.

Para determinar cúal hipótesis corresponde a la confianza y tolerancia que esperamos obtener, determinamos las personas que tienen un ingreso mayor a 1000 soles.

summary(df_form2$edad)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   17.0    22.0    28.0    33.4    45.0    67.0 
summary(df_form2$salidas_)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  0.000   1.000   2.000   2.492   3.000   6.000 
#Prueba de hipotesis encuesta

df_form2 %>%filter(ingreso=="[0-1000)") %>% group_by(ingreso) %>%
    summarise(mean = mean(salidas_, na.rm = TRUE)) %>%
    summarise(mean = mean(mean)) %>%
    as.numeric() -> promedio_mayor


#t.test(df_form2$salidas_,mu=promedio_total,alternative = "greater",conf.level=0.95)
promedio_mayor
[1] 2.739496
n=length(df_form2$salidas_)
xbarra=mean(df_form2$salidas_)
desv_estandarmuestra=sd(df_form2$salidas_)
desvbarra=desv_estandarmuestra/sqrt(n) # desviacion estandar de poblacion
nivel_confianza=0.95
mu_evaluar=promedio_mayor
z_observado=(xbarra-mu_evaluar)/desvbarra # estadístico de prueba
p_valor=pnorm(z_observado)  # cola izquierda

p_significancia=1-nivel_confianza

p_valor
[1] 0.002727884
p_significancia
[1] 0.05

De acuerdo a lo calculado el p-valor es menor a la significancia 0.05 especificada. Por lo que se rechaza H0 , una menor frecuencia de salida es influenciada por tener ingreso mayor a 1000 soles.

    1. H0: las personas con menos edad de 25 años no necesariamente tienen menores frecuencias de salida HI: las personas con menos edad de 25 años tienen menores frecuencias de salida

Se determina la media de salidas para las personas cuya edad es menor de 25 años.

df_form2 %>%filter(edad<25) %>% summarise(mean = mean(salidas_, na.rm = TRUE)) %>%
    summarise(mean = mean(mean)) %>%
    as.numeric() -> edad_prom
edad_prom
[1] 2.465116
n=length(df_form2$salidas_)
xbarra=mean(df_form2$salidas_)
desv_estandarmuestra=sd(df_form2$salidas_)
desvbarra=desv_estandarmuestra/sqrt(n) # desviacion estandar de poblacion
nivel_confianza=0.95
mu_evaluar=edad_prom
z_observado=(xbarra-mu_evaluar)/desvbarra # estadístico de prueba
p_valor=pnorm(z_observado)  # cola derecha

p_significancia=1-nivel_confianza

p_valor
[1] 0.6170337
p_significancia
[1] 0.05

Dado que el p_valor es mayor a la significancia, no se rechaza la Ho, ya que hay personas que tienen mayor edad que 25 años y salen menos que el promedio de frecuencia de salida.

Las hipótesis planteadas en relación al tipo de trabajo y genero, se corroborarán posteriormente.

#Estadística inferencial

Nuevos casos -> cambio movilización

df_infec %>% rename(date = FECHA_RESULTADO) -> df_infec_tmp
df_mov %>%
    group_by(date) %>%
    summarise(mov = mean(grocery_and_pharmacy_percent_change_from_baseline, na.rm=TRUE)) ->
    df_mov_tmp

df_case_mov <- merge(df_infec_tmp, df_mov_tmp)

plot(mov~N, data = df_case_mov, xlab="Nuevos casos", ylab="Movilización por víveres")
cases_mov_lm <- lm(mov~N, data = df_case_mov)

residuos <- rstandard(cases_mov_lm)
va <- fitted(cases_mov_lm)

abline(cases_mov_lm)

summary(cases_mov_lm )

Call:
lm(formula = mov ~ N, data = df_case_mov)

Residuals:
    Min      1Q  Median      3Q     Max 
-45.002  -9.008  -3.217  12.563  60.108 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept) -5.209e+01  3.284e+00  -15.86   <2e-16 ***
N            1.259e-03  9.838e-04    1.28    0.203    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 22.54 on 140 degrees of freedom
Multiple R-squared:  0.01157,   Adjusted R-squared:  0.004507 
F-statistic: 1.638 on 1 and 140 DF,  p-value: 0.2027
plot(cases_mov_lm )

cor(x = as.numeric(df_mov_tmp$date) , y = df_mov_tmp$mov, method = "pearson")
[1] -0.3052303

Tipo de trabajo -> Frecuencia de salida a la semana

Variable independiente: Tipo de trabajo

Variable dependiente: Frecuencia de salida a la semana

Para establecer si existe una relación entre ambas variables, se requiere de un indicador estadístico numérico.Dado que la variable tipo de trabajo es categórica nominal se dicotomiza en 0,1 y a partir de ello mediante un coeficiente de correlación biserial puntual se obtiene el grado de correlación de ambas variables.

df_trabajo<-df_form2%>%group_by(empleo)%>%filter(empleo!="No trabajo")%>%mutate(Variable_dicotomizada = as.numeric(empleo == "Formal"))%>%select(empleo,salidas,Variable_dicotomizada)%>%filter(salidas!="Mayor 5")
df_trabajo

Para saber si una mayor frecuencia de salida esta asociada a un empleo de tipo formal. Se determina el coeficiente de correlación biserial puntual.

Pruebas de Hipótesis:

  • H0: No existe correlación entre la frecuencia de salida y el tipo de trabajo.

H1: Existe correlación entre la frecuencia de salida y el tipo de trabajo.

\[rbp=(X1barra-Xbarra)/SX*sqrt(p/q) \]

df_trabajo_informal<-df_trabajo%>%filter(Variable_dicotomizada==0) # trabajadores informales
df_trabajo_formal<-df_trabajo%>%filter(Variable_dicotomizada==1) # trabajadores formales
X1barra<-mean(as.numeric(as.character(df_trabajo_formal$salidas))) #X1barra=promedio de la frecuencia de salida promedio de los trabajadores formales
Xbarra<-mean(as.numeric(as.character(df_trabajo$salidas)))# Xbarra=promedio de la frecuencia de salida promedio del total de personas encuestadas
SX<-sd(as.numeric(as.character(df_trabajo$salidas))) # SX=desv.estándar de la frecuencia de salida promeido del total de personas encuestadas
p=length(df_trabajo_formal$Variable_dicotomizada)/length(df_trabajo$Variable_dicotomizada)  #p= proporción de trabajadores formales en la muestra

q=length(df_trabajo_informal$Variable_dicotomizada)/length(df_trabajo$Variable_dicotomizada) #q=proporción de trabajadores informales en la muestra


rbp<-((X1barra-Xbarra)/SX)*sqrt(p/q)  # rbp=coeficiente de correlación biserial puntual
rbp
[1] -0.01890164

El coeficiente de correlación biserial puntual es muy bajo y negativo, la tendencia explica que es baja la correlación entre mayor frecuencia de salida promedio y un trabajo de tipo de informal.

Medida de Inmovilización social

Tipo de trabajo->Disminución de frecuencia de salida

Variable independiente: Tipo de trabajo

Variable dependiente: Disminución de frecuencia de salida para los trabajadores de tipo formal

df_inmovilizacion<-df_form2%>%group_by(empleo)%>%filter(empleo!="No trabajo")%>%mutate(Variable_dicotomizada = as.numeric(empleo == "Formal"))%>%select(empleo,social.05,Variable_dicotomizada)
df_inmovilizacion

Pruebas de Hipótesis:

  • H0: No existe correlación entre la disminución de frecuencia de salida y el tipo de trabajo.

  • H1: Existe correlación entre la disminución de frecuencia de salida y el tipo de trabajo.

Determinación del coeficiente de correlación biserial puntual

\[rbp=(X1barra-Xbarra)/SX*sqrt(p/q) \]

df_movilidad1<-df_inmovilizacion%>%filter(Variable_dicotomizada==0)
df_movilidad2<-df_inmovilizacion%>%filter(Variable_dicotomizada==1)
X1barra<-mean(as.numeric(as.character(df_movilidad2$social.05)))
Xbarra<-mean(as.numeric(as.character(df_inmovilizacion$social.05)))
SX<-sd(as.numeric(as.character(df_inmovilizacion$social.05)))

p=length(df_movilidad2$Variable_dicotomizada)/length(df_inmovilizacion$Variable_dicotomizada)


q=length(df_movilidad1$Variable_dicotomizada)/length(df_inmovilizacion$Variable_dicotomizada)

rbp<-((X1barra-Xbarra)/SX)*sqrt(p/q)
rbp
[1] 0.07258622

El coeficiente para la medida de Inmovilización social indica una correlación muy baja entre las variables. Esto significa que mayores disminuciones en la frecuencia de salida se correlacionan muy bajo con las personas de trabajo formal.

Medida: Retiro 2000 soles de fondos AFP de trabajadores afiliados

Tipo de trabajo->Disminución de frecuencia de salida

Variable independiente:Tipo de trabajo

Variable dependiente: Disminución de frecuencia de salida

df_retiro<-df_form2%>%group_by(empleo)%>%filter(empleo!="No trabajo")%>%mutate(Variable_dicotomizada = as.numeric(empleo == "Formal"))%>%select(empleo,afp1.05,Variable_dicotomizada)
df_retiro

Pruebas de Hipótesis:

  • H0: No existe correlación entre la disminución en la frecuencia de salida y el tipo de trabajo.

  • H1: Existe correlación entre la disminución en la frecuencia de salida y el tipo de trabajo.

Determinación del coeficiente de correlación biserial puntual \[rbp=(X1barra-Xbarra)/SX*sqrt(p/q) \]

df_retiro1<-df_retiro%>%filter(Variable_dicotomizada==0)
df_retiro2<-df_retiro%>%filter(Variable_dicotomizada==1)
X1barra<-mean(as.numeric(as.character(df_retiro2$afp1.05)))
Xbarra<-mean(as.numeric(as.character(df_retiro$afp1.05)))
SX<-sd(as.numeric(as.character(df_retiro$afp1.05)))

p=length(df_retiro2$Variable_dicotomizada)/length(df_retiro$Variable_dicotomizada)


q=length(df_retiro1$Variable_dicotomizada)/length(df_retiro$Variable_dicotomizada)

rbp<-((X1barra-Xbarra)/SX)*sqrt(p/q)
rbp
[1] -0.1667686

El coeficiente de correlación para la medida del retiro AFP es negativo y bajo. El signo negativo significa que el comportamiento positivo corresponde a los trabajadores informales. Por lo que mayores disminuciones de frecuencia de salida se correlacionan bajo con las personas de trabajo informal.

Género -> Frecuencia de salida a la semana

Variable independiente: Género

Variable dependiente: Frecuencia de salida a la semana

df_genero<-df_form2%>%group_by(genero)%>%mutate(Variable_dicotomizada = as.numeric(genero == "Masculino"))%>%select(genero,salidas,Variable_dicotomizada)%>%filter(salidas !="Mayor 5")


df_genero

Pruebas de Hipótesis:

  • H0: No existe una correlación entre frecuencia de salida a la semana y personas del género femenino.

  • H1: Existe una correlación entre frecuencia de salida a la semana y personas del género femenino.

Determinación del coeficiente de correlación biserial puntual \[rbp=(X1barra-Xbarra)/SX*sqrt(p/q) \]

df_femenino<-df_genero%>%filter(Variable_dicotomizada==0)
df_masculino<-df_genero%>%filter(Variable_dicotomizada==1)
X1barra<-mean(as.numeric(as.character(df_masculino$salidas)))
Xbarra<-mean(as.numeric(as.character(df_genero$salidas)))
SX<-sd(as.numeric(as.character(df_genero$salidas)))
p=length(df_masculino$Variable_dicotomizada)/length(df_genero$Variable_dicotomizada)


q=length(df_femenino$Variable_dicotomizada)/length(df_genero$Variable_dicotomizada)

rbp<-((X1barra-Xbarra)/SX)*sqrt(p/q)
rbp
[1] -0.01567836

El coeficiente es negativo para las personas de género masculino, esto significa que la correlación es positiva para las personas de género femenino. Dado que el coeficiente es pequeño, mayores frecuencias de salida se correlacionan bajo con las personas de género femenino.

Medida: Disposición salida de hombres y mujeres en días complementarios (lunes-miércoles-viernes / martes-jueves-sábados)

Género -> Disminución de Frecuencia de salida a la semana

Variable independiente:Genero

Variable dependiente: Disminución de Frecuencia de salida a la semana

df_medida_genero<-df_form2%>%group_by(genero)%>%mutate(Variable_dicotomizada = as.numeric(genero == "Masculino"))%>%select(genero,noday.05,Variable_dicotomizada)


df_medida_genero

Pruebas de Hipótesis:

  • H0: No existe una correlación entre la disminución de frecuencia de salida a la semana y personas del género femenino.

  • H1: Existe una correlación entre la disminución de frecuencia de salida a la semana y personas del género femenino.

Determinación del coeficiente biserial: \[rbp=(X1barra-Xbarra)/SX*sqrt(p/q) \]

df_med_femenino<-df_medida_genero%>%filter(Variable_dicotomizada==0)
df_med_masculino<-df_medida_genero%>%filter(Variable_dicotomizada==1)
X1barra<-mean(as.numeric(as.character(df_med_masculino$noday.05)))
Xbarra<-mean(as.numeric(as.character(df_medida_genero$noday.05)))
SX<-sd(as.numeric(as.character(df_medida_genero$noday.05)))
p=length(df_med_masculino$Variable_dicotomizada)/length(df_medida_genero$Variable_dicotomizada)


q=length(df_med_femenino$Variable_dicotomizada)/length(df_medida_genero$Variable_dicotomizada)


rbp<-((X1barra-Xbarra)/SX)*sqrt(p/q)  #p=informal/muestra , q=formal/muestra
rbp
[1] 0.0689382

El coeficiente es muy bajo por lo que existe una correlación muy baja entre mayores disminuciones de frecuencias de salida a la semana y personas de genero masculino.

Edad -> Frecuencia de salida

Pruebas de Hipótesis:

  • H0: No existe una correlación lineal entre la edad y la frecuencia de salida.

  • H1: Existe una correlación lineal entre la edad y la frecuencia de salida.

datos.f <-as.character(df_form2$salidas)
datos.n<-replace(datos.f,datos.f=="Mayor 5","6")
datos.n<-as.integer(datos.n)
edad_frec <- data.frame(df_form2$edad,datos.n)
edad_frec
plot(datos.n~df_form2.edad,data = edad_frec, xlab="edad", ylab="frecuencia de salida")
edad_frec_lm <- lm(datos.n~df_form2.edad, data =edad_frec )
abline(edad_frec_lm)

cor(x = df_form2$edad , y =(datos.n), method = "pearson")
[1] 0.01262241

El coeficiente en esta situación es muy bajo, por lo que no se puede detectar una relación entre las variables de edad y frecuencia de salida.

#Analisis de residuos

plot(edad_frec_lm)

summary(edad_frec_lm)

Call:
lm(formula = datos.n ~ df_form2.edad, data = edad_frec)

Residuals:
    Min      1Q  Median      3Q     Max 
-2.5345 -1.4733 -0.4749  0.5251  3.5331 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)   2.437878   0.242263  10.063   <2e-16 ***
df_form2.edad 0.001610   0.006742   0.239    0.811    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 1.694 on 358 degrees of freedom
Multiple R-squared:  0.0001593, Adjusted R-squared:  -0.002634 
F-statistic: 0.05705 on 1 and 358 DF,  p-value: 0.8114

Ingresos -> frecuencia de salida

Pruebas de Hipótesis:

  • H0: No existe correlación lineal entre ingresos mensuales y la frecuencia de salida a la semana.

  • H1: Existe correlación lineal entre ingresos mensuales y la frecuencia de salida a la semana.

#df_form2

(1000 * (as.numeric(df_form2$ingreso) - 1)) -> x
as.numeric(df_form2$salidas) - 1 -> y

ingresos_frec=lm(y~x)
plot(y~x, xlab="Ingresos mensuales", ylab="frecuencia de salida")
abline(ingresos_frec)

cor(x, y, method="pearson")
[1] -0.05150849

La tendencia muestra un leve decrecimiento en la frecuencia de salida al aumentar los ingresos. El coeficiente de correlación de pearson es negativo y bajo, por lo que solo existe, con una muy baja significancia, una correlaciÓn negativa de la frecuencia de salida respecto a los ingresos. Debido a que el v.absoluto del coeficiente es menor a 1 - , no se puede decidir la veracidad de esta tendencia.

summary(ingresos_frec)

Call:
lm(formula = y ~ x)

Residuals:
    Min      1Q  Median      3Q     Max 
-2.5616 -1.3255 -0.5026  0.5565  3.7041 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  2.562e+00  1.144e-01  22.388   <2e-16 ***
x           -2.952e-05  3.025e-05  -0.976     0.33    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 1.692 on 358 degrees of freedom
Multiple R-squared:  0.002653,  Adjusted R-squared:  -0.0001328 
F-statistic: 0.9523 on 1 and 358 DF,  p-value: 0.3298
plot(ingresos_frec)

Resultados generales

Conclusiones

Bibliografía

LS0tCnRpdGxlOiAiRWZlY3RvIGRlIGxhcyBtZWRpZGFzIHRvbWFkYXMgcG9yIGVsIGdvYmllcm5vIHBlcnVhbm8gZnJlbnRlIGFsIENPVklELTE5IgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRoZW1lOiBkYXJrbHkKICBodG1sX2RvY3VtZW50OgogICAgZGZfcHJpbnQ6IHBhZ2VkCi0tLQoKPHN0eWxlPiBib2R5IHt0ZXh0LWFsaWduOiBqdXN0aWZ5fSA8L3N0eWxlPgoKYGBge3IsZWNobz1GQUxTRSxtZXNzYWdlPUZBTFNFfQojIE5vIG9sdmlkZXMgaW5zdGFsYXIgbGFzIGRlcGVuZGVuY2lhcwpsaWJyYXJ5KGJlcnJ5RnVuY3Rpb25zKQpsaWJyYXJ5KGN1cmwpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHRtKQpsaWJyYXJ5KHdvcmRjbG91ZCkKCiMjIC0tLS0gY292aWQKdG1wIDwtIHRlbXBmaWxlKCkKY3VybF9kb3dubG9hZCgiaHR0cHM6Ly9jbG91ZC5taW5zYS5nb2IucGUvcy9ZOHczd0hzRWRZUVNaUnAvZG93bmxvYWQiLCB0bXApCgpyZWFkTGluZXModG1wKSAlPiUKICAgIGljb252KGZyb20gPSAiSVNPLTg4NTktMSIsIHRvID0gIlVURi04IikgJT4lCiAgICByZWFkX2NzdigpICU+JQogICAgbXV0YXRlKEZFQ0hBX1JFU1VMVEFETyA9IGx1YnJpZGF0ZTo6eW1kKEZFQ0hBX1JFU1VMVEFETykpIC0+IGRmCgojIyAtLS0tIG1vdmlsaXphdGlvbgp0bXAgPC0gdGVtcGZpbGUoKQpjdXJsX2Rvd25sb2FkKCJodHRwczovL3d3dy5nc3RhdGljLmNvbS9jb3ZpZDE5L21vYmlsaXR5L0dsb2JhbF9Nb2JpbGl0eV9SZXBvcnQuY3N2IiwgdG1wKQpyZWFkX2Nzdih0bXAsCiAgICAjIEVzdGEgcGFydGUgZGVqYWJhIGRlIGZ1bmNpb25hciBjYWRhIHZleiBxdWUgaGFiw61hIHVuYSBjYW1iaW8gZW4gbGFzIHZhcmlhYmxlcwogICAgY29sX3R5cGVzID0gY29scygKICAgICAgICBjb3VudHJ5X3JlZ2lvbl9jb2RlID0gY29sX2NoYXJhY3RlcigpLAogICAgICAgIGNvbnRyeV9yZWdpb24gPSBjb2xfY2hhcmFjdGVyKCksCiAgICAgICAgc3ViX3JlZ2lvbl8xID0gY29sX2NoYXJhY3RlcigpLAogICAgICAgIHN1Yl9yZWdpb25fMiA9IGNvbF9jaGFyYWN0ZXIoKSwKICAgICAgICBtZXRyb19hcmVhID0gY29sX2NoYXJhY3RlcigpLAogICAgICAgIGlzb18zMTY2XzJfY29kZSA9IGNvbF9jaGFyYWN0ZXIoKSwKICAgICAgICBjZW5zdXNfZmlwc19jb2RlID0gY29sX2NoYXJhY3RlcigpLAogICAgICAgIGRhdGUgPSBjb2xfZGF0ZSgpLAogICAgICAgIHJldGFpbF9hbmRfcmVjcmVhdGlvbl9wZXJjZW50X2NoYW5nZV9mcm9tX2Jhc2VsaW5lID0gY29sX2RvdWJsZSgpLAogICAgICAgIGdyb2NlcnlfYW5kX3BoYXJtYWN5X3BlcmNlbnRfY2hhbmdlX2Zyb21fYmFzZWxpbmUgPSBjb2xfZG91YmxlKCksCiAgICAgICAgcGFya3NfcGVyY2VudF9jaGFuZ2VfZnJvbV9iYXNlbGluZSA9IGNvbF9kb3VibGUoKSwKICAgICAgICB0cmFuc2l0X3N0YXRpb25zX3BlcmNlbnRfY2hhbmdlX2Zyb21fYmFzZWxpbmUgPSBjb2xfZG91YmxlKCksCiAgICAgICAgd29ya3BsYWNlc19wZXJjZW50X2NoYW5nZV9mcm9tX2Jhc2VsaW5lID0gY29sX2RvdWJsZSgpLAogICAgICAgIHJlc2lkZW50aWFsX3BlcmNlbnRfY2hhbmdlX2Zyb21fYmFzZWxpbmUgPSBjb2xfZG91YmxlKCkKICAgICkpICU+JQogICAgZmlsdGVyKGNvdW50cnlfcmVnaW9uX2NvZGUgPT0gIlBFIikgLT4gZGZfbW92CgojIyAtLS0tIGluZmVjCmRmICU+JQogICAgZ3JvdXBfYnkoRkVDSEFfUkVTVUxUQURPKSAlPiUKICAgIHN1bW1hcmlzZShOID0gbigpKSAlPiUKICAgIGFycmFuZ2UoRkVDSEFfUkVTVUxUQURPKSAlPiUKICAgIG11dGF0ZShOU1VNID0gY3Vtc3VtKE4pKSAtPiBkZl9pbmZlYwoKIyMgLS0tLSBwbG90X25ld19jYXNlcwpwbG90X25ld19jYXNlcyA8LSBmdW5jdGlvbihkYXksIG1pbl9kYXksIG1heF9kYXksIG1haW5fdGl0bGUpIHsKICAgIGRmX2luZmVjICU+JQogICAgICAgIGZpbHRlcihGRUNIQV9SRVNVTFRBRE8gPj0gbWluX2RheSAmIEZFQ0hBX1JFU1VMVEFETyA8PSBtYXhfZGF5KSAtPiBkZl90bXAKCiAgICBkZl9pbmZlYyAlPiUKICAgICAgICBmaWx0ZXIoRkVDSEFfUkVTVUxUQURPID49IG1pbl9kYXkgJiBGRUNIQV9SRVNVTFRBRE8gPCBkYXkpIC0+IGRmX3RtcF9hCgogICAgZGZfaW5mZWMgJT4lCiAgICAgICAgZmlsdGVyKEZFQ0hBX1JFU1VMVEFETyA+IGRheSAmIEZFQ0hBX1JFU1VMVEFETyA8PSBtYXhfZGF5KSAtPiBkZl90bXBfYgoKICAgIGRmX3RtcCAlPiUKICAgICAgICBwbG90KE5+RkVDSEFfUkVTVUxUQURPLCBkYXRhID0gLiwgbWFpbiA9IG1haW5fdGl0bGUsIHhsYWIgPSAiRmVjaGEiLCB5bGFiID0gIk51ZXZvcyBjYXNvcyIpCgogICAgbWVhbjEgPC0gbWVhbihkZl90bXBfYSROKQogICAgc2VnbWVudHMoYXMuRGF0ZShtaW5fZGF5KS0xLCBtZWFuMSwgYXMuRGF0ZShkYXkpLCBtZWFuMSwgY29sID0gInJlZCIpCgogICAgbWVkaWFuMSA8LSBtZWRpYW4oZGZfdG1wX2EkTikKICAgIHNlZ21lbnRzKGFzLkRhdGUobWluX2RheSktMSwgbWVkaWFuMSwgYXMuRGF0ZShkYXkpLCBtZWRpYW4xLCBjb2wgPSAiYmx1ZSIpCgogICAgbWVhbjIgPC0gbWVhbihkZl90bXBfYiROKQogICAgc2VnbWVudHMoYXMuRGF0ZShkYXkpLCBtZWFuMiwgYXMuRGF0ZShtYXhfZGF5KSsxLCBtZWFuMiwgY29sID0gInJlZCIsIGx0eSA9IDIpCgogICAgbWVkaWFuMiA8LSBtZWRpYW4oZGZfdG1wX2IkTikKICAgIHNlZ21lbnRzKGFzLkRhdGUoZGF5KSwgbWVkaWFuMiwgYXMuRGF0ZShtYXhfZGF5KSsxLCBtZWRpYW4yLCBjb2wgPSAiYmx1ZSIsIGx0eSA9IDIpCgogICAgbGVnZW5kKCJ0b3ByaWdodCIsIGxlZ2VuZD1jKCJQcm9tZWRpbyBhbnRlcyIsICJNZWRpYW5hIGFudGVzIiwgIlByb21lZGlvIGRlc3B1w6lzIiwgIk1lZGlhbmEgZGVzcHXDqXMiKSwKICAgICAgIGNvbD1jKCJyZWQiLCAiYmx1ZSIsICJyZWQiLCAiYmx1ZSIpLCBsdHk9YygxLDEsMiwyKSwgY2V4PTAuOCkKfQoKIyMgLS0tLSBwbG90X3N1bV9jYXNlcwpwbG90X3N1bV9jYXNlcyA8LSBmdW5jdGlvbihkYXksIG1pbl9kYXksIG1heF9kYXksIG1haW5fdGl0bGUpIHsKICAgIGRmX2luZmVjICU+JQogICAgICAgIGZpbHRlcihGRUNIQV9SRVNVTFRBRE8gPj0gbWluX2RheSAmIEZFQ0hBX1JFU1VMVEFETyA8PSBtYXhfZGF5KSAlPiUKICAgICAgICBwbG90KE5TVU1+RkVDSEFfUkVTVUxUQURPLCBkYXRhID0gLiwgbWFpbiA9IG1haW5fdGl0bGUsIHhsYWIgPSAiRmVjaGEiLCB5bGFiID0gIkNhc29zIHRvdGFsZXMiKQp9CgojIyAtLS0tIHBsb3Rfcm1vdmVzCnBsb3Rfcm1vdmVzIDwtIGZ1bmN0aW9uKGRheSwgbWluX2RheSwgbWF4X2RheSwgbWFpbl90aXRsZSkgewogICAgZGZfbW92ICU+JQogICAgICAgIGdyb3VwX2J5KGRhdGUpICU+JQogICAgICAgIHN1bW1hcmlzZShtb3YgPSBtZWFuKHJldGFpbF9hbmRfcmVjcmVhdGlvbl9wZXJjZW50X2NoYW5nZV9mcm9tX2Jhc2VsaW5lLCBuYS5ybSA9IFRSVUUpKSAtPiBkZl90bXAKCiAgICBkZl90bXAgJT4lIGZpbHRlcihkYXRlID49IG1pbl9kYXkgJiBkYXRlIDwgZGF5KSAtPiBkZl90bXBfYQogICAgZGZfdG1wICU+JSBmaWx0ZXIoZGF0ZSA+IGRheSAmIGRhdGUgPD0gbWF4X2RheSkgLT4gZGZfdG1wX2IKICAgIGRmX3RtcCAlPiUgZmlsdGVyKGRhdGUgPj0gbWluX2RheSAmIGRhdGUgPD0gbWF4X2RheSkgLT4gZGZfdG1wCgogICAgZGZfdG1wICU+JQogICAgICAgIHBsb3QobWFpbiA9IG1haW5fdGl0bGUsIHhsYWIgPSAiRmVjaGEiLCB5bGFiID0gIkNhbWJpbyBkZSBtb3ZpbGl6YWNpb24iKQoKICAgIG1lYW4xIDwtIG1lYW4oZGZfdG1wX2EkbW92KQogICAgc2VnbWVudHMoYXMuRGF0ZShtaW5fZGF5KS0xLCBtZWFuMSwgYXMuRGF0ZShkYXkpLCBtZWFuMSwgY29sID0gInJlZCIpCgogICAgbWVkaWFuMSA8LSBtZWRpYW4oZGZfdG1wX2EkbW92KQogICAgc2VnbWVudHMoYXMuRGF0ZShtaW5fZGF5KS0xLCBtZWRpYW4xLCBhcy5EYXRlKGRheSksIG1lZGlhbjEsIGNvbCA9ICJibHVlIikKCiAgICBtZWFuMiA8LSBtZWFuKGRmX3RtcF9iJG1vdikKICAgIHNlZ21lbnRzKGFzLkRhdGUoZGF5KSwgbWVhbjIsIGFzLkRhdGUobWF4X2RheSkrMSwgbWVhbjIsIGNvbCA9ICJyZWQiLCBsdHkgPSAyKQoKICAgIG1lZGlhbjIgPC0gbWVkaWFuKGRmX3RtcF9iJG1vdikKICAgIHNlZ21lbnRzKGFzLkRhdGUoZGF5KSwgbWVkaWFuMiwgYXMuRGF0ZShtYXhfZGF5KSsxLCBtZWRpYW4yLCBjb2wgPSAiYmx1ZSIsIGx0eSA9IDIpCgogICAgbGVnZW5kKCJ0b3ByaWdodCIsIGxlZ2VuZD1jKCJQcm9tZWRpbyBhbnRlcyIsICJNZWRpYW5hIGFudGVzIiwgIlByb21lZGlvIGRlc3B1w6lzIiwgIk1lZGlhbmEgZGVzcHXDqXMiKSwKICAgICAgIGNvbD1jKCJyZWQiLCAiYmx1ZSIsICJyZWQiLCAiYmx1ZSIpLCBsdHk9YygxLDEsMiwyKSwgY2V4PTAuOCkKfQoKIyMgLS0tLSBjYXRfZnVuY3Rpb24KY2F0X2Z1bmN0aW9uIDwtIGZ1bmN0aW9uKGZfbmFtZSwgbWluX2RheSwgbWF4X2RheSkgewogICAgY2F0KCJgYGB7cn1cbiIpCiAgICBjYXQoZl9uYW1lKQogICAgY2F0KCIoXCIiKQogICAgY2F0KGZvcm1hdChhcy5EYXRlKG1pbl9kYXkpLCAiJVktJW0tJWQiKSkKICAgIGNhdCgiXCIsIFwiIikKICAgIGNhdChmb3JtYXQoYXMuRGF0ZShtYXhfZGF5KSwgIiVZLSVtLSVkIikpCiAgICBjYXQoIlwiKVxuYGBgXG5cbiIpCn0KCiMjIC0tLS0gY2F0X3RpdGxlCmNhdF90aXRsZSA8LSBmdW5jdGlvbihmX3RpdGxlLCBtaW5fZGF5LCBtYXhfZGF5KSB7CiAgICBjYXQoIiMjIiwKICAgICAgICBmX3RpdGxlLAogICAgICAgIGZvcm1hdChhcy5EYXRlKG1pbl9kYXkpLCAiJW0tJWQiKSwKICAgICAgICAiLT4iLAogICAgICAgIGZvcm1hdChhcy5EYXRlKG1heF9kYXkpLCAiJW0tJWQiKSwKICAgICAgICAiXG4iCiAgICApCn0KCiMjIC0tLS0gY2F0X3Bsb3QKY2F0X3Bsb3QgPC0gZnVuY3Rpb24oZGF5LCByYW5nZSwgIG1haW5fdGl0bGUsIGZ1biwgdGl0bGUpIHsKICAgIG1pbl9kYXkgPC0gZGF5IC0gcmFuZ2UKICAgIG1heF9kYXkgPC0gZGF5ICsgcmFuZ2UKCiAgICBjYXRfdGl0bGUodGl0bGUsIG1pbl9kYXksIG1heF9kYXkpCiAgICBjYXRfZnVuY3Rpb24oYmVycnlGdW5jdGlvbnM6OmdldE5hbWUoZnVuKSwgbWluX2RheSwgbWF4X2RheSkKCiAgICAjIFByaW50IGRhdGUgaW4gdGl0bGUKICAgIGRhdGVfc3RyIDwtIHBhc3RlKCIoIixmb3JtYXQoYXMuRGF0ZShkYXkpLCAiJVktJW0tJWQiKSAsIikiLCBzZXA9IiIpCiAgICBmdW4oZGF5LCBtaW5fZGF5LCBtYXhfZGF5LCBwYXN0ZShtYWluX3RpdGxlLCBkYXRlX3N0cikpCiAgICBhYmxpbmUodiA9IGFzLkRhdGUoZGF5KSkKCiAgICBjYXQoIlxuLlxuXG5cbiIpCn0KCiMjIC0tLS0gcmVwZWF0X3Bsb3RzCnJlcGVhdF9wbG90cyA8LSBmdW5jdGlvbihkYXksIHJhbmdlLCBtYWluX3RpdGxlID0gIiIpIHsKICAgIGRheSA8LSBsdWJyaWRhdGU6OnltZChkYXkpCiAgICBjYXRfcGxvdChkYXksIHJhbmdlLCBtYWluX3RpdGxlLCBwbG90X25ld19jYXNlcywgIk51ZXZvcyBjYXNvcyIpCiAgICBjYXRfcGxvdChkYXksIHJhbmdlLCBtYWluX3RpdGxlLCBwbG90X3Jtb3ZlcywgIk1vdmlsaXphY2nDs24gcmVjcmVhY2lvbmFsIikKfQpgYGAKClshW1IgQ0ldKGh0dHBzOi8vZ2l0aHViLmNvbS8yMDIwLTAxLWVzdC0xOS9wcm95ZWN0by93b3JrZmxvd3MvUiUyMENJL2JhZGdlLnN2ZyldKGh0dHBzOi8vZ2l0aHViLmNvbS8yMDIwLTAxLWVzdC0xOS9wcm95ZWN0by9hY3Rpb25zP3F1ZXJ5PXdvcmtmbG93JTNBJTIyUitDSSUyMikKWyFbUHB0XShodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlL0lvc2xpZGVzLVBwdC1pbmZvcm1hdGlvbmFsP2xvZ289UildKC4vcHJlcy5odG1sKQpbIVtHaXRIdWIgZm9ya3NdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vZ2l0aHViL2ZvcmtzLzIwMjAtMDEtZXN0LTE5L3Byb3llY3RvLnN2Zz9zdHlsZT1zb2NpYWwmbGFiZWw9Rm9yayZtYXhBZ2U9MjU5MjAwMCldKGh0dHBzOi8vZ2l0aHViLmNvbS8yMDIwLTAxLWVzdC0xOS9wcm95ZWN0bykKCiMgUHJvZmVzb3I6CiogSm9zZSBNaWd1ZWwgUmVub20KCiMgQ3Vyc286CiogRXN0YWTDrXN0aWNhIHkgUHJvYmFiaWxpZGFkZXMKCiMgSW50ZWdyYW50ZXMKKiBHw6luZXNpcyBGbG9yZXMgQXJyb3lvCiogQW5nZWwgU2FsdmFkb3IgQ2FsbGVqYSBDYXN0aWxsbwoqIEVzdGViYW4gVmlsbGFjb3J0YSBHYXJjaWEKKiBBbGJlcnRvIE9wb3J0byBBbWVzCiogUmljYXJkbyBBdHN1aGlrbyBZYW1hbW90byBZYW1hbW90bwoKIyBMw61kZXIKKiBBbGJlcnRvIE9wb3J0byBBbWVzCgojIEludHJvZHVjY2nDs24KRWwgQ09WSUQtMTkgaGEgdGVuaWRvIHVuIGdyYW4gaW1wYWN0byBhbHJlZGVkb3IgZGVsIG11bmRvIHkgaG95IGVuIGRpYSBlcyBmw6FjaWxtZW50ZQplbCB0ZW1hIGRlbCBxdWUgbcOhcyBzZSBoYWJsYS4KVG9kb3MgbG9zIHBhw61zZXMgaGFuIHRvbWFkbyBtZWRpZGFzIGNvbiByZXNwZWN0byBhIGVzdGEgcGFuZGVtaWEsCnNpbiBlbWJhcmdvIHVub3MgbGFzIGhhbiB0b21hZG8gbXV5IHRhcmRlIHkgZXN0byBzZSBoYSB2aXN0byBhZmVjdGFkbyBlbiBsYSBleHBhbnNpw7NuCmRlbCB2aXJ1cyBlbiBlbGxvcy4KRW4gUGVyw7osIGxhcyBtZWRpZGFzIHNlIGVtcGV6YXJvbiBhIHRvbWFyIHLDoXBpZGFtZW50ZSwKcGVybyB1bmEgY2FudGlkYWQgY29uc2lkZXJhYmxlIGRlIGxhIHBvYmxhY2nDs24gbm8gaGEgY3VtcGxpZG8gY29uIGxhcyBpbm1vdmlsaXphY2lvbmVzCnNvY2lhbGVzIHkgZXN0byBzZSBoYSB2aXN0byByZWZsZWphZG8gZW4gbGEgZXhwYW5zacOzbiBkZWwgdmlydXMgZW4gZWwgcGHDrXMuCsK/Q8OzbW8gcG9kZW1vcyBzYWJlciBjdcOhbGVzIGhhbiBzaWRvIGxhcyBtZWRpZGFzIG3DoXMgcmVzcGV0YWRhcyB5IHBvciBxdcOpPwpMYSByZXNwdWVzdGEgYSBlc3RhIHByZWd1bnRhIGxlIHNlcsOtYSBkZSBtdWNoYSBheXVkYSBhbCBnb2JpZXJubyBwZXJ1YW5vLAp5YSBxdWUgY29uIGVzdGEgaW5mb3JtYWNpw7NuIHNlIHBvZHLDrWEgc2FiZXIgcXVlIHRpcG8gZGUgbWVkaWRhcyBkZWJlcsOtYSB0b21hciB5IGVuIHF1w6kKbW9tZW50b3MgcGFyYSBxdWUgc2UgY3VtcGxhbiBkZSBtYW5lcmEgc2F0aXNmYWN0b3JpYS4KRXMgcG9yIGVsbG8gcXVlIG51ZXN0cm8gZ3J1cG8gaGEgZGVjaWRpZG8gaW52ZXN0aWdhciBhY2VyY2EgZGUgbGEgZWZlY3RpdmlkYWQgZGUgbGFzCm1lZGlkYXMgdG9tYWRhcyB5IHN1IHJlbGFjacOzbiBjb24gbGEgbW92aWxpemFjacOzbiBzb2NpYWwgZGUgbG9zIGNpdWRhZGFub3MuCgojIEZhY3RpYmlsaWRhZApFc3RlIHRyYWJham8gZXMgZmFjdGlibGUsIGRlYmlkbyBhIHF1ZSBsYSBtYXlvciBwYXJ0ZSBkZSBsYSBpbmZvcm1hY2nDs24gbGEgcG9kZW1vcwpjb25zZWd1aXIgZGUgZ3LDoWZpY29zIHlhIGV4aXN0ZW50ZXMgY29uIHJlbGFjacOzbiBhbCBDT1ZJRC0xOSBlbiBQZXLDuiB5IGxhIGluZm9ybWFjacOzbgpmYWx0YW50ZSBsYSBwb2RlbW9zIGFkcXVpcmlyIGEgdHJhdsOpcyBkZSBlbmN1ZXN0YXMuCkFkZW3DoXMsIGxvcyBlZmVjdG9zIGRlIGxhcyBtZWRpZGFzIHRvbWFkYXMgcG9yIGVsIGdvYmllcm5vIGVuIGxhIG1vdmlsaXphY2nDs24gc29jaWFsIHlhCnNlIHB1ZWRlbiBhbmFsaXphciwgZGViaWRvIGEgcXVlIHN1IGluZm9ybWFjacOzbiBzZSBvYnRpZW5lIHNvbGFtZW50ZSBkw61hcyBkZXNwdcOpcyBkZQppbXBsZW1lbnRhcmxhcy4KRmluYWxtZW50ZSwgZXN0YSBpbnZlc3RpZ2FjacOzbiBzZSBwdWVkZSBsbGV2YXIgYSBjYWJvIGVuIGVsIHRpZW1wbyBkYWRvLApkZWJpZG8gYSBxdWUgbm8gZXMgdW4gdHJhYmFqbyBxdWUgcmVxdWllcmEgdGllbXBvIGRlIGVzcGVyYSBwYXJhIGxsZWdhciBhIGNvbmNyZXRhcnNlLgpFc3RvIHF1aWVyZSBkZWNpciBxdWUgbG8gcG9kZW1vcyBlbXBlemFyIGlubWVkaWF0YW1lbnRlLgoKIyBPYmpldGl2b3MKTGEgaW1wb3J0YW5jaWEgZGUgZXN0ZSBlc3R1ZGlvIGVzdGFkw61zdGljbyByYWRpY2EgZW4gZWwgYW7DoWxpc2lzIGRlIGFsZ3VuYXMgZGUgbGFzCm1lZGlkYXMgcXVlIGVsIGdvYmllcm5vIGhhIGRlY2xhcmFkbyBhbnRlIGxhIGNveXVudHVyYSBkZWwgQ292aWQtMTkuCkVzIGltcG9ydGFudGUgZXN0dWRpYXIgc3UgZWZlY3RvIGVuIGxhIG1vdmlsaXphY2nDs24gc29jaWFsLApwdWVzdG8gcXVlIHBvZHLDrWEgb3RvcmdhciB1biBwYW5vcmFtYSBtw6FzIGhvbMOtc3RpY28geSB2ZXLDrWRpY28gc29icmUgbGFzIG1lZGlkYXMgcXVlCmdlbmVyYW4gdW4gaW1wYWN0byBwb3NpdGl2byBlbiBsYSBkZXNhY2VsZXJhY2nDs24gZGUgbGEgcHJvcGFnYWNpw7NuIGRlbApudWV2byB2aXJ1cyBTYXJzLUNvVi0yLgoKIyMgT2JqZWN0aXZvcyBnZW5lcmFsZXMKKiBFbCBvYmpldGl2byBkZSBlc3RlIHRyYWJham8gZXMgZGV0ZXJtaW5hciBlbiBxdcOpIG1lZGlkYSBsYXMgZGlmZXJlbnRlcyBhY2Npb25lcwpxdWUgaGEgYXBsaWNhZG8gZWwgZ29iaWVybm8sIGRlc2RlIGVsIGluaWNpbyBkZWwgcGVyaW9kbyBkZSBjdWFyZW50ZW5hIGhhc3RhIGVsCnRpZW1wbyBkZWwgZXN0dWRpbywgIHJlZHVqZXJvbiBlbCBpbXBhY3RvIHkgZXhwYW5zacOzbgpkZWwgQ292aWQtMTkgZW4gZWwgUGVyw7ouClF1ZXJlbW9zIGF2ZXJpZ3VhciBlbCBlZmVjdG8gZGUgZXN0YXMgbWVkaWRhcyBlbiAyIGRpZmVyZW50ZXMgYXNwZWN0b3MuCkVzdG9zIHNvbjogbGEgbW92aWxpemFjacOzbiBzb2NpYWwgeQpkZSBxdcOpIG1hbmVyYSBhZmVjdGFuIGxhIGN1cnZhIGRlIGF1bWVudG8gZGUgaW5mZWN0YWRvcyBwb3IgY29yb25hdmlydXMgZW4gUGVyw7ouCgojIyBPYmpldGl2b3MgZXNwZWPDrWZpY29zCiogRXN0YWJsZWNlciBsYXMgbWVkaWRhcyBhIGVzdHVkaWFyIHkgcXVlIGVzdGFzIHNlIGVuY3VlbnRyZW4gYWxpbmVhZGFzIGEKbGEgaW5tb3ZpbGl6YWNpw7NuIHNvY2lhbC4KKiBEZXNhcnJvbGxhciBoYWJpbGlkYWRlcyBkZSBjb211bmljYWNpw7NuIGhhY2llbmRvIHVzbyBkZWwgcHJvZ3JhbWEgUi1TdHVkaW8geSBlbCBsZW5ndWFqZSBkZSBSLgoqIEVzdGFibGVjZXIgbG9zIGZhY3RvcmVzIHF1ZSBkZXRlcm1pbmFuIGxhIHByZXN0YWNpw7NuIGRlIHNlcnZpY2lvcyBww7pibGljb3MgeQpzdSByZWxhY2nDs24gY29uIGxhIHByb3BhZ2FjacOzbiBkZWwgdmlydXMuCiogRXN0YWJsZWNlciB1bmEgcmVsYWNpw7NuIGVudHJlIGVsIGJvbm8gc3Vic2lkaW8geQplbCBkZXNhY2F0byBhIGxhIGlubW92aWxpemFjacOzbiBzb2NpYWwuCiogRXN0YWJsZWNlciBsYXMgcHJpbmNpcGFsZXMgcmF6b25lcyBkZSBsYXMgcGVyc29uYXMgcGFyYQpkZXNvYmVkZWNlciBsYSBpbm1vdmlsaXphY2nDs24gc29jaWFsLgoKIyBNYXJjbyBUZcOzcmljbwoKIyMgUG9ibGFjacOzbiBvYmpldGl2bwpMYSBwb2JsYWNpw7NuIGRlIGludGVyw6lzIHNvbiBsb3MgY2l1ZGFkYW5vcyBwZXJ1YW5vcy4KUGFyYSBsb2dyYXIgcXVlIG51ZXN0cmFzIHVuaWRhZGVzIG11ZXN0cmFsZXMgc2VhbiBsb3MgbcOhcyByZXByZXNlbnRhdGl2YSBwb3NpYmxlLApoZW1vcyBkZWNpZGlkbyBkZWxpbWl0YXIgbnVlc3RyYSBwb2JsYWNpw7NuIG9iamV0aXZvIGFsIMOhcmVhIGRlIExpbWEuCkVzdG8gc2UgZGViZSBhIHF1ZSBudWVzdHJvcyBlbmN1ZXN0YWRvcyBzZSBlbmN1ZW50cmFuIGVuIGVzdGEgem9uYSB5CmxhIG1heW9yIGNhbnRpZGFkIGRlIHBvYmxhY2nDs24gc2UgZW5jdWVudHJhIGFxdcOtLgoKIyMgVW5pZGFkIG11ZXN0cmFsCiogUGFyYSBsYXMgZW5jdWVzdGFzIG51ZXN0cmEgdW5pZGFkIG11ZXN0cmFsIHNvbiBsb3MgYWx1bW5vcyBkZSBsYSBVbml2ZXJzaWRhZCBVVEVDIHkgc3VzIGZhbWlsaWFzIFsxOCAtIDUwIGHDsW9zXQoqIENvbiByZXNwZWN0byBhIGxvcyBkYXRvcyB5IGdyw6FmaWNvcyBicmluZGFkb3MgcG9yIGxhIHdlYiwgbnVlc3RyYSB1bmlkYWQgbXVlc3RyYWwgZXMgbGEgY2l1ZGFkIGRlIExpbWEuCiogQWNjZWRlcmVtb3MgYSBsYXMgb2JzZXJ2YWNpb25lcyB5L28gbWVkaWNpb25lcyBkZSBsYXMgdW5pZGFkZXMgbXVlc3RyYWxlcyBtZWRpYW50ZQpmdWVudGVzIGRlIGludGVybmV0IHF1ZSBwcmVzZW50YW4gZmlhYmlsaWRhZCwgcmVzcGFsZG8gZGVsIGdvYmllcm5vLgpEZWwgbWlzbW8gbW9kbywgc2UgcmVhbGl6YXLDoW4gZW5jdWVzdGFzIGEgbG9zIGFsdW1ub3MgZGUgVVRFQyB5IHN1cyBmYW1pbGlhcmVzCmEgdHJhdsOpcyBkZSBwcmVndW50YXMgcmVsYWNpb25hZGFzIGNvbiBzdSBtb3ZpbGl6YWNpw7NuIHNvY2lhbCBhbnRlcyB5IGR1cmFudGUgbGEKY3VhcmVudGVuYS4KRWxsbyBjb24gZWwgcHJvcMOzc2l0byBkZSBlbmNvbnRyYXIgbGFzIHJhem9uZXMgZGUgbW92aWxpemFjacOzbgoKIyMgTXVlc3RyZW8KVGlwbyBkZSBtdWVzdHJlbwoKRWwgdGlwbyBkZSBtdWVzdHJlbyBlcyBhbGVhdG9yaW8gc2ltcGxlIGVzdHJhdGlmaWNhZG8gcGFyYSBjaXVkYWRhbm9zIGNvbiBlZGFkZXMKZW50cmUgMTgtNTAgYcOxb3MuCkVsbG8sIGRhZG8gcXVlIHRvZG9zIGxvcyBpbmRpdmlkdW9zIGRlIHN1YmNvbmp1bnRvIGRlIGxhIHBvYmxhY2nDs24gb2JqZXRpdm8KdGllbmVuIGxhIG1pc21hIHByb2JhYmlsaWRhZCBkZSBzZXIgc2VsZWNjaW9uYWRvcy4KCiMjIFRhbWHDsW8gZGUgbGEgbXVlc3RyYQoqIFBhcmEgbGEgaW52ZXN0aWdhY2nDs24sIHNlIGJ1c2NhIGN1bXBsaXIgcG9yIGxvIG1lbm9zIGNvbjoKPDAuMDUsIGU8MC4wNQoqUGFyYSBlbmNvbnRyYXIgdW4gbsO6bWVybyBtw61uaW1vIGRlIHBlcnNvbmFzIGEgZW50cmV2aXN0YXIsIG1hbnRlbmllbmRvIHVuYSBjb25maWFuemEgZGUgOTUlIHkgbWFyZ2VuIGRlIGVycm9yIGRlIDUlLCBzZSB1dGlsaXrDsyBsYSBzaWd1aWVudGUgZsOzcm11bGE6CgokJG4gPSBaXjJwKDEtcCkvZV4yJCQKCkNvbW8gbm8gaGF5IHRvZGF2w61hIGRhdG9zIHBhcmEgb2J0ZW5lciBlbCB2YWxvciByZWFsIGRlIHAsIHNlIGFzdW1lIHAgPSAwLjUuIENvbiBlbGxvLCBzZSBvYnRpZW5lIHVuIHRhbWHDsW8gZGUgbXVlc3RyYSBkZSBwb3IgbG8gbWVub3MgOTEgcGVyc29uYXMgcGFyYSBzZXIgc2lnbmlmaWNhdGl2by4KCiMgUHJvdmVuaWVuY2lhIGRlIGxvcyBkYXRvcwpFeGlzdGVuIHZhcmlhcyBmdWVudGVzIGRlIGxhIHF1ZSBlcyBwb3NpYmxlIGV4dHJhZXIgbGEgaW5mb3JtYWNpw7NuIG5lY2VzYXJpYQpwYXJhIHJlc3BvbmRlciBsYXMgcHJlZ3VudGFzLgoKKiBDb21wZW5kaW8gZGUgbm9ybWFzIGVtaXRpZGFzIHBvciBlbCBFc3RhZG8gUGVydWFubyBwYXJhIGFmcm9udGFyIGxhIHByb3BhZ2FjacOzbgogIGRlbCBDb3ZpZC0xOS4gKDEgZGUgZmVicmVybyBkZSAyMDIwIGFsIDcgZGUgbWF5byBkZSAyMDIwKQoqIE5vcm1hdGl2YSBzb2JyZSBFc3RhZG8gZGUgRW1lcmdlbmNpYSBwb3IgQ29yb25hdmlydXMuCiogQWNjaW9uZXMgYWRvcHRhZGFzIHBvciBlbCBnb2JpZXJubyBhbnRlIENPVklELTE5ICgyMDIwKQoqIENPVklELTE5IENvbW11bml0eSBNb2JpbGl0eSBSZXBvcnQgKDIwMjApLgoKKk5vdGE6IFRvZGFzIHNlIGVuY3VlbnRyYW4gY2l0YWRhcyBlbiBiaWJsaW9ncmFmw61hLioKCkxhIGluZm9ybWFjacOzbiBjb250ZW5pZGEgZW4gZXN0YXMgZGlyZWNjaW9uZXMgc29uIG9yaWdpbmFsZXMsCmFkZW3DoXMgZGUgY29uZmlhYmxlcywgZGFkbyBxdWUgc2UgcHJlc2VudGEgY2FkYSBtZWRpZGEgY29uIHN1IHJlc3BlY3Rpdm8gZGVjcmV0bwpsZWdpc2xhdGl2by4KQXNpbWlzbW8sIGxvcyBkYXRvcyBlc3RhZMOtc3RpY29zIGN1ZW50YW4gY29uIHN1c3RlbnRvIGRlIGZ1ZW50ZXMgb2ZpY2lhbGVzLgoKIyBVc28gZGUgZGF0b3MKCkNvbiByZXNwZWN0byBhbCB1c28gZGUgbG9zIGRhdG9zIG9idGVuaWRvcyBkZSBmdWVudGVzLCB0ZW5lbW9zIGNsYXJvIGPDs21vIHV0aWxpemFyIGNhZGEgdW5vIGRlIGVsbG9zLgpMYSBmdWVudGUgZGUgbGEgcXVlIGFkcXVpcmltb3MgbGEgaW5mb3JtYWNpw7NuIHJlc3BlY3RvIGEgbGFzIG1lZGlkYXMgdG9tYWRhcyBub3MgZXMgZGUKbXVjaGEgYXl1ZGEsIHlhIHF1ZSBqdW50byBhIGVsbGFzIGVzdMOhbiBsYXMgZmVjaGFzIGVuIGxhcyBxdWUgc2UgbGxldmFyb24gYSBjYWJvLgpFc3RvIG5vcyBwZXJtaXRlIGFuYWxpemFyIGxhIHBvYmxhY2nDs24gYW50ZXMgeSBkZXNwdcOpcyBkZSBxdWUgc2UgaW1wbGVtZW50YXLDoW4KZXN0YXMgbWVkaWRhcy4KCkxhcyBmdWVudGVzIGRlIGxhcyBxdWUgYWRxdWlyaW1vcyBsYXMgZ3LDoWZpY2FzIGRlIGlubW92aWxpemFjacOzbiBzb2NpYWwgdGFtYmnDqW4gbm9zCnNvbiBkZSBncmFuIGF5dWRhIHBvcnF1ZSBub3MgcGVybWl0ZW4gcmVsYWNpb25hciBsYXMgZmVjaGFzIGVuIGxhcyBxdWUgc2UgbGxldmFyb24KYSBjYWJvIGxhcyBtZWRpZGFzIGd1YmVybmFtZW50YWxlcyBjb24gZWwgZmx1am8gZGUgZ2VudGUgZW4gbGFzIGNhbGxlcy4KRXN0YSByZWxhY2nDs24gZXMgbXV5IGltcG9ydGFudGUsIHlhIHF1ZSBub3MgcGVybWl0aXLDoSBhbmFsaXphciBsYSBlZmVjdGl2aWRhZCBkZQpsb3MgZGVjcmV0b3MgeSBub3MgYXl1ZGFyw6EgYSBsb2dyYXIgbnVlc3Ryb3Mgb2JqZXRpdm9zLgpFbCBwcm9jZXNhbWllbnRvIGRlIGxhIGRhdGEgb2J0ZW5pZGEgZW4gbGFzIGZ1ZW50ZXMgZXMgbXV5IGltcG9ydGFudGUsCmRlYmlkbyBhIHF1ZSBwb3Igc8OtIHNvbGFzIG5vcyBtdWVzdHJhbiBpbmZvcm1hY2nDs24g4oCcY3J1ZGHigJ0gcXVlIHRvZG8gZWwgbXVuZG8geWEgY29ub2NlLgpBbCBwcm9jZXNhciBlc3RhIGRhdGEgeSByZWxhY2lvbmFybGEgY29uIG90cmEvcywgbGEgaW52ZXN0aWdhY2nDs24gc2UgdnVlbHZlIG3DoXMKaW50ZXJlc2FudGUsIHlhIHF1ZSBsYXMgcmVsYWNpb25lcyBlbnRyZSBkaWZlcmVudGVzIGVzdGFkw61zdGljYXMgc29uCnBvc2libGVtZW50ZSBkZXNjb25vY2lkYXMgeSBsZSBicmluZGFuIGluZm9ybWFjacOzbiBtdWNobyBtw6FzIMO6dGlsIGFsIGxlY3Rvci4KCiMgUGxhbmlmaWNhY2nDs24KCjxpbWcgc3JjPSJnYW50dC5zdmciPgoKIyBNZWRpZGFzIGVsZWdpZGFzCgoxLiBEZWNyZXRvIGRlIGVzdGFkbyBkZSBlbWVyZ2VuY2lhLgogICAgLSDCv0N1w6FsIGZ1ZSBlbCBlZmVjdG8gcXVlIHR1dm8gZWwgZGVjcmV0byBkZSBlc3RhZG8gZGUgZW1lcmdlbmNpYSBlbgogICAgbGEgcG9ibGFjacOzbiBlbW9jaW9uYWxtZW50ZT8gKEV4cGxvcmF0b3JpYSkKCjIuIERlY3JldG8gZGUgVXJnZW5jaWEgcXVlIGRpY3RhIG1lZGlkYXMgZXh0cmFvcmRpbmFyaWFzIGNvbiBsYSBmaW5hbGlkYWQgZGUKYWRxdWlyaXIgYmllbmVzIHkgc2VydmljaW9zIG5lY2VzYXJpb3MgcGFyYSBlbCBhbG9qYW1pZW50byBlbiBjdWFyZW50ZW5hIHkKYWxpbWVudGFjacOzbiBkZSBsYXMgcGVyc29uYXMgcXVlIGRlYmFuIGRlc3BsYXphcnNlIGRlbnRybyBkZWwgcGHDrXMgYQpjb25zZWN1ZW5jaWEgZGUgbGEgZGVjbGFyYWNpw7NuIGRlbCBFc3RhZG8gZGUgRW1lcmdlbmNpYSBOYWNpb25hbCBwb3IgZWwgQ09WSUQtMTkgKDM4MCkKICAgIC0gwr9MYSBjYW50aWRhZCBkZSBwZXJzb25hcyBxdWUgc2Ugdmllcm9uIGJlbmVmaWNpYWRhcyBwb3IgZXN0ZSBkZWNyZXRvIGZ1ZQogICAgc3VmaWNpZW50ZSBwYXJhIHF1ZSBzZSByZWR1emNhIGNvbnNpZGVyYWJsZW1lbnRlIGVsIHRyw6Fuc2l0byBkZSBnZW50ZT8gKEluZmVyZW5jaWFsKQoKMy4gQXBydWViYW4gZWwgUGFkcsOzbiBkZSBsb3MgaG9nYXJlcyBlbiBjb25kaWNpw7NuIGRlIHBvYnJlemEgbyBwb2JyZXphIGV4dHJlbWEKYmVuZWZpY2lhcmlvcyBkZWwgc3Vic2lkaW8gbW9uZXRhcmlvIGRlIGFjdWVyZG8gYWwgU2lzdGVtYSBkZSBGb2NhbGl6YWNpw7NuIGRlCkhvZ2FyZXMgKFNJU0ZPSCkgcXVlIHNlIGVuY3VlbnRyZW4gZW4gbG9zIMOhbWJpdG9zIGdlb2dyw6FmaWNvcyBjb24gbWF5b3IKdnVsbmVyYWJpbGlkYWQgc2FuaXRhcmlhIGVuIGVsIG1hcmNvIGRlbCBELlUuIE7CsCAwMjctMjAyMCAoNjgpCiAgICAtIMK/TGEgdGFzYSBkZSBwZXJzb25hcyBxdWUgcmVjaWJlbiBsYSBib25pZmljYWNpw7NuIHBvciBkw61hIGZ1ZSBhbGNhbnphYmxlIGEgbGEKICAgIG1heW9yw61hIGRlIHBlcnNvbmFzIGRlbCBzZWN0b3IgdnVsbmVyYWJsZT8gKERlc2NyaXB0aXZhKQoKNC4gRGlzcG9zaWNpw7NuIHByZXNpZGVuY2lhbCBxdWUgcGVybWl0ZSBsYSBzYWxpZGEgZGUgaG9tYnJlcyB5IG11amVyZXMgZW4gZMOtYXMKY29tcGxlbWVudGFyaW9zIChsdW5lcy1tacOpcmNvbGVzLXZpZXJuZXMgLyBtYXJ0ZXMtanVldmVzLXPDoWJhZG9zKQogICAgLSDCv1F1w6kgZGlmZXJlbmNpYSBodWJvIGVuIGVsIHRyw6Fuc2l0byBkZSBwZXJzb25hcyBlbnRyZSBsb3MgZMOtYXMgcGFyYSBob21icmVzIHkKICAgIHBhcmEgbXVqZXJlcz8gKERlc2NyaXB0aXZhKQogICAgLSDCv0EgZMOzbmRlIHNlIGRpcmlnZSBsYSBtYXlvciBwYXJ0ZSBkZWwgZmx1am8gZGUgcGVyc29uYXM/IMK/UXXDqSByYXrDs24gZXhwbGljYXLDrWEgZXN0bz8gKEV4cGxvcmF0b3JpYSkKCiMjICBQcmVndW50YXMgcHJvcHVlc3RhcyBwYXJhIGVzdHVkaW8gKHBhcmEgbG9zIGVuY3Vlc3RhZG9zKQoKfE7CsCB8IFByZWd1bnRhIHwgVGlwbyB8CnwtLS18LS0tLS0tLS0tLXwtLS0tLS18CnwxICB8wr9RdcOpIGVkYWQgdGllbmVuIGxvcyBtaWVtYnJvcyBkZSBsYSBtdWVzdHJhP3wgRGVzY3JpcHRpdmF8CnwyICB8wr9EZSBxdcOpIGfDqW5lcm8gc29uP3wgRGVzY3JpcHRpdmF8CnwzICB8wr9DdcOhbnRvIGVzIHN1IGluZ3Jlc28gcHJvbWVkaW8/fCBEZXNjcmlwdGl2YXwKfDQgIHzCv0VuIHF1w6kgZGlzdHJpdG8gdml2ZXM/fCBEZXNjcmlwdGl2YXwKfDUgIHzCv0N1w6FsIGZ1ZSBlbCDDumx0aW1vIG5pdmVsIGVkdWNhdGl2byBxdWUgY29tcGxldGFzdGU/fCBEZXNjcmlwdGl2YXwKfDYgIHzCv1N1IHRpcG8gZGUgZW1wbGVvIGVzIGZvcm1hbCBvIGluZm9ybWFsP3wgRGVzY3JpcHRpdmF8Cnw3ICB8wr9RdcOpIHRhbiBmcmVjdWVudGVtZW50ZSBzYWzDrWEgZGUgY2FzYSBwcmV2aWFtZW50ZSBhbCBjb21pZW56byBkZSBsYSBjdWFyZW50ZW5hP3wgRGVzY3JpcHRpdmF8Cnw4ICB8wr9RdcOpIHRhbnRvIGNvbnNpZGVyYXMgcXVlIHR1IGRpc3RyaXRvIHNlIGhhIHZpc3RvIGFmZWN0YWRvIHBvciBsYSBlbmZlcm1lZGFkP3wgRGVzY3JpcHRpdmF8Cnw5ICB8wr9Qb3IgcXXDqSByYXpvbmVzIHNhbMOtYXMgZHVyYW50ZSBsYSBjdWFyZW50ZW5hP3wgRGVzY3JpcHRpdmF8CnwxMCAgfMK/Q29uc2lkZXJhcyBxdWUgZXN0YSBtZWRpZGEg4oCcYy91IGRlIGxhcyBtZWRpZGFz4oCdIGZ1ZSBlZmVjdGl2YSBwYXJhIHJlZHVjaXIgZWwgbsO6bWVybyBkZSBjb250YWdpb3MgZW4gdHUgZGlzdHJpdG8/fCBEZXNjcmlwdGl2YXwKfDExfMK/UXXDqSBjb25kaWNpb25lcyBjcmVlcyBxdWUgYWNlbGVyYW4gbGEgcHJvcGFnYWNpw7NuIGRlbCBDb3ZpZCBlbiB0dSBkaXN0cml0bz98IERlc2NyaXB0aXZhfAp8MTIgfMK/UXXDqSBjb25kaWNpb25lcyBjcmVlcyBxdWUgcmV0YXJkYW4gbGEgcHJvcGFnYWNpw7NuIGRlbCBDb3ZpZCBlbiB0dSBkaXN0cml0bz98IERlc2NyaXB0aXZhfAp8MTMgfMK/UXXDqSBtZWRpZGFzIGd1YmVybmFtZW50YWxlcyBzb24gbGFzIHF1ZSByZWN1ZXJkYXMgcXVlIHNlIGhheWFuIHRvbWFkbz98IERlc2NyaXB0aXZhfAoKCiMjICBQcmVndW50YXMgcHJvcHVlc3RhcyBwYXJhIGVzdHVkaW8gKHBhcmEgbGEgZGF0YSkKCgp8TsKwIHwgUHJlZ3VudGEgfCBUaXBvIHwKfC0tLXwtLS0tLS0tLS0tfC0tLS0tLXwKfDE0ICB8wr9RdcOpIHRhbnRvIHZhcsOtYW4gbGFzIGNpZnJhcyBkZSBudWV2b3MgaW5mZWN0YWRvcyBkdXJhbnRlIGxvcyBwZXJpb2RvcyBkZSBpbnN0YXVyYWNpw7NuIHByZXZpb3MtcG9zdGVyaW9yZXMgYSBsYSBtZWRpZGE/fCBEZXNjcmlwdGl2YXwKfDE1ICB8wr9DdcOhbGVzIGVyYW4gbGFzIHJhem9uZXMgcG9yIGxhcyBxdWUgbGEgcG9ibGFjacOzbiBzYWzDrWEgZHVyYW50ZSBsYSBjdWFyZW50ZW5hP3wgRGVzY3JpcHRpdmF8CnwxNiAgfMK/Q3XDoWxlcyBoYW4gc2lkbyBsYXMgbWVkaWRhcyBxdWUgaGFuIHRlbmlkbyBtYXlvciBpbXBhY3RvIGVuIGxhIHBvYmxhY2nDs24/fCBEZXNjcmlwdGl2YXwKfDE3ICB8RXhpc3RlIHVuYSBtaXNtYSB0ZW5kZW5jaWEgZGUgcG9ibGFjaW9uZXMgYWZlY3RhZGFzIHBvciBlbCBDb3ZpZCAxOSBkdXJhbnRlIGxhcyBtZWRpZGFzIGRlIGFpc2xhbWllbnRvPyB8IEV4cGxvcmF0b3JpYXwKfDE4ICB8wr9MYXMgbWVkaWRhcyBlbiBsb3MgZGlzdHJpdG9zIG3DoXMgZXhjbHVzaXZvcyBwcmVzZW50YW4gdW5hIG1heW9yIG8gbWVub3IgZWZlY3RpdmlkYWQ/fCBFeHBsb3JhdG9yaWF8CnwxOSAgfMK/TGEgZW50cmVnYSBkZSBtYXlvcmVzIHN1YnNpZGlvcyBtb25ldGFyaW9zIHJlc3VsdGFyw61hIGVuIHVuIGltcG9ydGFudGUgYmVuZWZpY2lvIHBhcmEgbGEgZGlzbWludWNpw7NuIGRlbCBuw7ptZXJvIGRlIHNhbGlkYXM/fCBJbmZlcmVuY2lhbHwKfDIwICB8wr9FcyBwb3NpYmxlIHByZWRlY2lyIGN1w6FudGFzIGhvcmFzIGVuIHByb21lZGlvIHVuYSBwZXJzb25hIHNhbMOtYSBkZSBjYXNhIGNvbm9jaWVuZG8gc3Ugbml2ZWwgZGUgaW5ncmVzb3MgeSBlbCBkaXN0cml0byBkZSByZXNpZGVuY2lhP3wgUHJlZGljdGl2YXwKfDIxICB8wr9FcyBwb3NpYmxlIHByZWRlY2lyIHN1IG5pdmVsIGRlIGluZ3Jlc29zIGNvbm9jaWVuZG8gw7puaWNhbWVudGUgc3UgdGlwbyBkZSBlbXBsZW8/fCBQcmVkaWN0aXZhfAp8MjIgIHzCv1F1w6kgZmFjdG9yZXMgZGV0ZXJtaW5hbiBxdWUgbGEgcHJvcGFnYWNpw7NuIGRlbCBDb3ZpZCAxOSBzZSBkZXNhY2VsZXJlP3wgQ2F1c2FsfAp8MjMgIHzCv0PDs21vIGNpZXJ0YXMgY29uZGljaW9uZXMgZGV0ZXJtaW5hbiBxdWUgbGEgcHJvcGFnYWNpw7NuIGRlbCBDT1ZJRCBzZSBhY2VsZXJlIC8gcmV0YXJkZT98IE1lY2Fuw61zdGljYXwKCiMgVmFyaWFibGVzCgp8VmFyaWFibGV8IFJlbGFjacOzbiBjb24gcHJlZ3VudGF8IFRpcG8gZGUgdmFyaWFibGV8CnwtLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLXwKfEVkYWR8IDF8IEN1YW50aXRhdGl2YSBkaXNjcmV0YXwKfEfDqW5lcm98IDJ8IEN1YWxpdGF0aXZhIG5vbWluYWx8CnxDbGFzZSBzb2NpYWx8IDMsMTcsMTgsMjAsMjF8IEN1YWxpdGF0aXZhIG9yZGluYWx8CnxOaXZlbCBlZHVjYXRpdm8gYWxjYW56YWRvfCA1LDE3LDE4fCBDdWFsaXRhdGl2YSBvcmRpbmFsfAp8VGlwbyBkZSB0cmFiYWpvfCA2LDE4LDIxfCBDdWFsaXRhdGl2YSBub21pbmFsfAp8RnJlY3VlbmNpYSBkZSBzYWxpZGEgfCA3LDE4LDE5fCBDdWFudGl0YXRpdmEgZGlzY3JldGF8CnxMdWdhciBkb25kZSB2aXZlIChkaXN0cml0byl8IDQsMTcsMTgsMjB8IEN1YWxpdGF0aXZhIG5vbWluYWx8CnxDYW50aWRhZCBkZSBpbmZlY3RhZG9zIHBvciBkaWF8IDE0LDE5fCBDdWFudGl0YXRpdmEgZGlzY3JldGF8CnxUaWVtcG8gYW50ZXMgeSBkZXNwdWVzIGRlIGxhcyBtZWRpZGFzfDE0LDE3LDE4fCBDdWFudGl0YXRpdmEgY29udGludWF8CnxKdXN0aWZpY2FjaW9uIGRlIHNhbGlkYXwgOSwxNXwgQ3VhbGl0YXRpdmEgbm9taWxhbHwKfE1lZGlkYXMgYXBsaWNhZGFzfCAxMCwxNiwxNywxOCwxOXwgQ3VhbGl0YXRpdmEgbm9taW5hbHwKfEZhY3RvcmVzfCAyMiwyM3wgQ3VhbGl0YXRpdmEgbm9taW5hbHwKCiMgRGVzY3JpcHRvcmVzIG51bcOpcmljb3MgcGFyYSBsYXMgdmFyaWFibGVzIGRlIG1heW9yIGltcG9ydGFuY2lhOgoKIyMgVmFyaWFibGVzIERhdGEgd2ViCgoqIENhbnRpZGFkICBkZSAgcGVyc29uYXMgcXVlIHNlIG1vdmlsaXphbiBlbiBsYXMgY2FsbGVzIGFudGVzIHkgZGVzcHXDqXMgZGUgY2FkYSB1bmEgZGUgbGFzIG1lZGlkYXMsIFRpZW1wbywgTWVkaWRhcyBhcGxpY2FkYXM6CgotIE1lZGlhICh2YWxvcik6IHBlcm1pdGlyw6EgIGNvbm9jZXIgZW4gcHJvbWVkaW8gY3XDoW50b3MgIGNpdWRhZGFub3MgbGltZcOxb3Mgc2UgbW92aWxpemFuICBhbnRlcyB5IGRlc3B1w6lzIGRlIGxhIG1lZGlkYQoKLSBNZWRpYW5hLCBjdWFydGlsZXMgKHZhbG9yKTogcGVybWl0aXLDoSBzYWJlciBjdcOhbnRvcyBjaXVkYWRhbm9zIGxpbWXDsW9zIHNlIG1vdmlsaXphbiBhbCAyNSUsIDUwJTsgNzUlLCAxMDAlICBkZWwgdGllbXBvIGRlIGVzdHVkaW8sIGRlIGVzdGEgbWFuZXJhIHNlIGNvbm9jZXLDoSAgZWwgZWZlY3RvIGRlIGxhIG1vdmlsaXphY2nDs24gY29uIGVsIHRyYW5zY3Vyc28gZGVsIHRpZW1wbyBwYXJhIGNhZGEgbWVkaWRhLgoKLSBEZXN2aWFjacOzbiBlc3TDoW5kYXI6IHBlcm1pdGlyw6Egc2FiZXIgY3XDoW50YXMgc29uIGxhcyB2YXJpYWNpb25lcyBwcm9tZWRpbyAgZGUgbW92aWxpemFjacOzbiBzb2NpYWwgcmVzcGVjdG8gYSBsYSBtZWRpYQoKIyMgQ2FudGlkYWQgZGUgaW5mZWN0YWRvcyBwb3IgZMOtYSwgdGllbXBvOgoKKiBNZWRpYSh2YWxvcik6IHBlcm1pdGlyw6EgY29ub2NlciBjdcOhbnRvIGVzIGxhIHRhc2EgaW5mZWN0YWRvcyBxdWUgIGh1Ym8gZW4gcHJvbWVkaW8gYW50ZXMgeSBkZXNwdcOpcyBkZSBtZWRpZGEgYXBsaWNhZGEKCiogTWVkaWFuYSwgY3VhcnRpbGVzICh2YWxvcik6IHBlcm1pdGlyw6Egc2FiZXIgY3XDoW50b3MgaW5mZWN0YWRvcyBodWJvIGFsIDI1JSwgNTAlOzc1JSwgMTAwJSAgZGVsIHRpZW1wbyBkZSBlc3R1ZGlvLCBkZSBlc3RhIG1hbmVyYSBzZSBjb25vY2Vyw6EgIGVsIGVmZWN0byBkZWwgbsO6bWVybyBkZSBpbmZlY3RhZG9zIGNvbiBlbCB0cmFuc2N1cnNvIGRlbCB0aWVtcG8gcGFyYSBjYWRhIG1lZGlkYS4KCiogRGVzdmlhY2nDs24gZXN0w6FuZGFyOiBwZXJtaXRpcsOhIHNhYmVyIGN1w6FudGFzIHNvbiBsYXMgdmFyaWFjaW9uZXMgcHJvbWVkaW8gZGUgaW5mZWN0YWRvcyByZXNwZWN0byBhIGxhIG1lZGlhLgoKIyBWYXJpYWJsZXMgRW5jdWVzdGFzCgojIyBGcmVjdWVuY2lhIGRlIHNhbGlkYSBwcm9tZWRpbyBhIGxhIHNlbWFuYQoKKiBNZWRpYW5hLCBjdWFydGlsZXMgKHZhbG9yKTogcGVybWl0aXLDoSBzYWJlciBjdcOhbnRhcyBzYWxpZGFzIGEgbGEgc2VtYW5hIHJlcHJlc2VudGEgMjUlLDUwJSw3NSUgZGUgbG9zIGNpdWRhZGFub3MgZGUgTGltYSBlbmN1ZXN0YWRvcyBwYXJhIGNhZGEgbWVkaWRhIHkgdmFyaWFibGUgZGUgaW50ZXLDqXMKCiogTW9kYSAodmFsb3IpOiBwZXJtaXRpcsOhIHNhYmVyIGxhIGZyZWN1ZW5jaWEgZGUgc2FsaWRhIG1heW9yaXRhcmlhIGRlIGxvcyBjaXVkYWRhbm9zIGRlIExpbWEgZW5jdWVzdGFkb3MKCiMjIFRpcG8gZGUgdHJhYmFqbwoKKiBGcmVjdWVuY2lhIGRlIG9ic2VydmFjaW9uZXMgcGFyYSBjYWRhIHRpcG8gZGUgdHJhYmFqbyBlbiByZWxhY2nDs24gYSBzdSBmcmVjdWVuY2lhIGRlIHNhbGlkYQoKIyMgRWRhZAoKKiBNZWRpYW5hLCBjdWFydGlsZXMgKHZhbG9yKTogcGVybWl0aXLDoSBzYWJlciBjdcOhbnRhcyBzYWxpZGFzIGEgbGEgc2VtYW5hIHJlcHJlc2VudGEgMjUlLDUwJSw3NSUgZGUgbG9zIGNpdWRhZGFub3MgZGUgTGltYSBlbmN1ZXN0YWRvcyBwYXJhIGNhZGEgZnJlY3VlbmNpYSBkZSBzYWxpZGEsIHkgY2FkYSBtZWRpZGEKCiMjIERpc3RyaXRvCgoqIE1vZGEodmFsb3IpOiBwZXJtaXRpcsOhIGNvbm9jZXIgZW4gcXXDqSBkaXN0cml0byBpbmNpZGVuIG3DoXMgZW4gbGFzIHZlY2VzIGRlIHNhbGlkYSBkZSBsYXMgcGVyc29uYXMKCiMjIEluZ3Jlc29zIG1lbnN1YWxlcwoKKiBNb2RhKHZhbG9yKTogcGVybWl0aXLDoSBjb25vY2VyIGVsIG5pdmVsIGRlIGluZ3Jlc29zIHBvciBjYWRhIGRpc3RyaXRvLgoKCiMjIEfDqW5lcm8KKkZyZWN1ZW5jaWEgZGUgb2JzZXJ2YWNpb25lcyBwYXJhIGNhZGEgZ8OpbmVybyBlbiByZWxhY2nDs24gYSBzdSBmcmVjdWVuY2lhIGRlIHNhbGlkYQoKIyBEZXNjcmlwdG9yZXMgZ3LDoWZpY29zCgojIyMgVXRpbGl6YXJlbW9zOgoKR3LDoWZpY2EgZGUgZGlzcGVyc2nDs24gcGFyYSBub3RhciBmw6FjaWxtZW50ZSBjb21vIGF1bWVudGEgbyBkZWNyZWNlIGxhIGNhbnRpZGFkIGRlIGluZmVjdGFkb3MgZSBpbmZlY3RhZG9zIHBvciBkaWEgYW50ZXMgeSBkZXNwdcOpcyBkZSBxdWUgc2UgYXBsaXF1ZSBsYSBtZWRpZGEuIEFkZW3DoXMsIGxhIGdyw6FmaWNhIGRlIGRpc3BlcnNpw7NuIG5vcyBwdWVkZSBheXVkYXIgYSBlbmNvbnRyYXIgdW5hIHJlbGFjacOzbiB5L28gcGF0csOzbiBlbnRyZSBsYSBjYW50aWRhZCBkZSBpbmZlY3RhZG9zIHkvbyBtb3ZpbGl6YWNpw7NuIHNvY2lhbCB5IGxvcyBkw61hcyB0cmFuc2N1cnJpZG9zIGRlc2RlIHF1ZSBzZSBlbXBsZcOzIGNhZGEgbWVkaWRhLgoKVGFtYmnDqW4gdXRpbGl6YXJlbW9zIHVuIGdyw6FmaWNvIGRlIGNhamEgZGUgYmlnb3RlcyBwYXJhIGRpZmVyZW5jaWFyIGxhcyBlZGFkZXMgZGUgbG9zIGVudHJldmlzdGFkb3MgZGUgbWFuZXJhIHLDoXBpZGEgeSBlZmVjdGl2YS4gRXN0byBub3MgcGVybWl0aXLDoSB2ZXIgbGEgcmVsYWNpw7NuIGVudHJlIGxhcyBlZGFkZXMgeSByZXNwdWVzdGFzIGRhZGFzIHBvciBsYXMgcGVyc29uYXMuCgpBZGVtw6FzLCBzZSB1dGlsaXphcsOhbiBncsOhZmljb3MgZGUgYmFycmFzIHByaW5jaXBhbG1lbnRlIHBhcmEgdmlzdWFsaXphciB5IGFuYWxpemFyIGxhcyByZXNwdWVzdGFzIGN1YWxpdGF0aXZhcy4gQ29uIGxvcyBncsOhZmljb3MgZGUgYmFycmFzIHNlIHBvZHLDoW4gdmVyIGN1YWxlcyBoYW4gc2lkbyBsYXMgcmVzcHVlc3RhcyBjdWFsaXRhdGl2YXMgcmVzcG9uZGlkYXMgY29uIG3DoXMgeSBtZW5vcyBmcmVjdWVuY2lhLgoKRmluYWxtZW50ZSwgc2UgdXNhcsOhbiBoaXN0b2dyYW1hIHBhcmEgZGVzY3JpYmlyIGxhcyB2YXJpYWJsZXMgY3VhbnRpdGF0aXZhcyBxdWUgcHVlZGVuIHNlciBkaXN0cmlidWlkYXMgZW4gcmFuZ29zLiBFc3RvIG5vcyBmYWNpbGl0YXLDoSBhbmFsaXphciBsb3MgZGF0b3MgY29uIG11Y2hvcyB2YWxvcmVzIG8gcmVzcHVlc3RhcyBwb3NpYmxlcy4KCiMjIFBsb3RzIHkgb3RyYXMgY29zYXMKYGBge3J9CiMgY3VybCAtTHMgIiR1cmwiID4gZGZfZm9ybS5jc3YKCnRtcCA8LSB0ZW1wZmlsZSgpCmN1cmxfZG93bmxvYWQoImh0dHBzOi8vZG9jcy5nb29nbGUuY29tL3NwcmVhZHNoZWV0cy9kL2UvMlBBQ1gtMXZTNUZ3c0tIbDRQaHVrSUhmU0diZkE4TkNRNVNxQkRwUTE2S0M2OUpDaUZBV1ZlSjQwQkFDcDBkcWhCVGtIaTljcExFX0ptRW1JdmZkdkEvcHViP2dpZD02MzcxMDA4NDMmc2luZ2xlPXRydWUmb3V0cHV0PWNzdiIsIHRtcCkKcmVhZF9jc3YodG1wKSAtPiBkZl9mb3JtMQoKIyBTZWd1bmRhIGVuY3Vlc3RhCnRtcCA8LSB0ZW1wZmlsZSgpCmN1cmxfZG93bmxvYWQoImh0dHBzOi8vZG9jcy5nb29nbGUuY29tL3NwcmVhZHNoZWV0cy9kL2UvMlBBQ1gtMXZTNUZ3c0tIbDRQaHVrSUhmU0diZkE4TkNRNVNxQkRwUTE2S0M2OUpDaUZBV1ZlSjQwQkFDcDBkcWhCVGtIaTljcExFX0ptRW1JdmZkdkEvcHViP2dpZD02MzcxMDA4NDMmc2luZ2xlPXRydWUmb3V0cHV0PWNzdiIsIHRtcCkKCnJlYWRfY3N2KHRtcCkgJT4lCiAgICByZW5hbWUoCiAgICAgICAgdGllbXBvID0gIk1hcmNhIHRlbXBvcmFsIiwKICAgICAgICBlZGFkID0gIsK/Q3XDoWwgZXMgdHUgZWRhZD8iLAogICAgICAgIGdlbmVybyA9ICLCv0RlIHF1w6kgZ8OpbmVybyBlcmVzPyIsCiAgICAgICAgaW5ncmVzbyA9ICLCv0N1w6FudG8gZXMgZWwgaW5ncmVzbyBtZW5zdWFsIHByb21lZGlvIGRlIHR1IGZhbWlsaWEgYXByb3hpbWFkYW1lbnRlIChzb2xlcykgPyIsCiAgICAgICAgZGlzdHJpdG8gPSAiwr9FbiBxdcOpIGRpc3RyaXRvIHZpdmVzPyIsCiAgICAgICAgZXN0dWRpbyA9ICLCv0N1w6FsIGZ1ZSBlbCDDumx0aW1vIG5pdmVsIGVkdWNhdGl2byBxdWUgY29tcGxldGFzdGU/IiwKICAgICAgICBlbXBsZW8gPSAiwr9DdcOhbCBlcyB0dSB0aXBvIGRlIGVtcGxlbz8iLAogICAgICAgIHNhbGlkYXMgPSAiwr9DdcOhbnRhcyB2ZWNlcyBhIGxhIHNlbWFuYSwgZW4gcHJvbWVkaW8sIHNhbMOtYXMgZGUgY2FzYSBkdXJhbnRlIGxvcyBkw61hcyBkZSBjdWFyZW50ZW5hPyIsCiAgICAgICAgcmF6b25lcyA9ICLCv1BvciBxdcOpIHJhem9uZXMgc2Fsw61hcyBkdXJhbnRlIGxhIGN1YXJlbnRlbmE/IiwKICAgICAgICBzb2NpYWwuYm9vbCA9ICLCv0xhIG1lZGlkYSBkZSBcIklubW92aWxpemFjacOzbiBzb2NpYWxcIiwgcmVhbG1lbnRlIGhpem8gcXVlIHR1cyBzYWxpZGFzIGR1cmFudGUgdG9kYSBsYSBjdWFyZW50ZW5hIGZ1ZXJhbiBtdXkgcG9jYXM/IiwKICAgICAgICBzb2NpYWwuMDUgPSAiUmVzcGVjdG8gYSBsYSBhbnRlcmlvciBwcmVndW50YS4gRGVsIDAgYWwgNSwgwr8gRW4gY3XDoW50byBkaXNtaW51ecOzIHR1cyBzYWxpZGFzIGR1cmFudGUgbGEgY3VhcmVudGVuYT8iLAogICAgICAgIG9jaW8uYm9vbCA9ICLCvyBMYSBcIlN1c3BlbnNpw7NuIGRlIGFjY2VzbyBhIGx1Z2FyZXMgcMO6YmxpY29zOiBsdWdhcmVzIGRlIG9jaW8sIHJlc3RhdXJhbnRlcywgZXRjXCIsIHRlIGRlc2FuaW3DsyBzYWxpciBkZSBjYXNhPyIsCiAgICAgICAgb2Npby4wNSA9ICJSZXNwZWN0byBhIGxhIGFudGVyaW9yIHByZWd1bnRhLiBEZWwgMCBhbCA1LCDCv0N1w6FudG8gdGUgZGVzYW5pbcOzIHNhbGlyIGRlIGNhc2E/IiwKICAgICAgICBub2RheS5ib29sID0gIsK/TGEgbWVkaWRhIFwiRGlzcG9zaWNpw7NuIHNhbGlkYSBkZSBob21icmVzIHkgbXVqZXJlcyBlbiBkw61hcyBjb21wbGVtZW50YXJpb3MgKGx1bmVzLW1pw6lyY29sZXMtdmllcm5lcyAvIG1hcnRlcy1qdWV2ZXMtc8OhYmFkb3MpXCIsIGdhcmFudGl6byBxdWUgc2FsaWVyYXMgbWVub3MgcXVlIGFudGVzPyIsCiAgICAgICAgbm9kYXkuMDUgPSAiUmVzcGVjdG8gYSBsYSBhbnRlcmlvciBwcmVndW50YS4gRGVsIDAgYWwgNSwgwr9DdcOhbnRvIGNhbWJpbyB0dXMgc2FsaWRhcz8iLAogICAgICAgIG11bHRhLmJvb2wgPSAiwr8gTGEgbWVkaWRhIFwiTXVsdGEgZGUgUy8uODYgLVMvLjM0MCBwYXJhIHRvZGFzIGxhcyBwZXJzb25hcyBxdWUgZGVzb2JlZGVjZW4gZGlzcG9zaWNpb25lcyBkZWwgZ29iaWVybm9cIiwgaGl6byBxdWUgdHVzIHNhbGlkYXMgZGUgY2FzYSBmdWVyYW4gbWVub3Jlcz8iLAogICAgICAgIG11bHRhLjA1ID0gIlJlc3BlY3RvIGEgbGEgYW50ZXJpb3IgcHJlZ3VudGEuIERlbCAwIGFsIDUsIMK/Q3XDoW4gbWVub3JlcyBmdWVyb24gdHVzIHNhbGlkYXM/IiwKICAgICAgICBib25vLmJvb2wgPSAiwr8gTGEgbWVkaWRhIFwiRW50cmVnYSBkZSBib25vIFMvLiAzODAsIFMvLjc2MCBkZSBhY3VlcmRvIGFsIFNpc3RlbWEgZGUgRm9jYWxpemFjacOzbiBkZSBIb2dhcmVzIChTSVNGT0gpIFwiLCBwZXJtaXRpw7MgcXVlIHJlZHVqZXJhcyB0dXMgc2FsaWRhcyBkZSBjYXNhPyIsCiAgICAgICAgYm9uby4wNSA9ICJSZXNwZWN0byBhIGxhIGFudGVyaW9yIHByZWd1bnRhLiBEZWwgMCBhbCA1LCDCv0N1w6FudG8gc2UgcmVkdWpvIHR1cyBzYWxpZGFzPyIsCiAgICAgICAgYWZwMS5ib29sID0gIsK/IExhIG1lZGlkYSBcIlJldGlybyBkZSBoYXN0YSBTLy4gMjAwMCBkZSBmb25kb3MgQUZQIGRlIHRyYWJhamFkb3JlcyBhZmlsaWFkb3MgcXVlIG5vIHRpZW5lbiBwbGFuaWxsYVwiLCB0ZSBtYW50dXZvIG3DoXMgdGllbXBvIGVuIGNhc2E/IiwKICAgICAgICBhZnAxLjA1ID0gIlJlc3BlY3RvIGEgbGEgYW50ZXJpb3IgcHJlZ3VudGEuIERlbCAwIGFsIDUsIMK/IEN1w6FuIG3DoXMgdGUgbWFudHV2aXN0ZSBlbiBjYXNhPyIsCiAgICAgICAgYWZwMi5ib29sID0gIsK/IExhIG1lZGlkYSBcIlJldGlybyBkZWwgMjUlIGRlIGZvbmRvcyBBRlAgcGFyYSB0cmFiYWphZG9yZXMgYWZpbGlhZG9zXCIsIHRlIG1hbnR1dm8gbcOhcyB0aWVtcG8gZW4gY2FzYT8iLAogICAgICAgIGFmcDIuMDUgPSAiUmVzcGVjdG8gYSBsYSBhbnRlcmlvciBwcmVndW50YS4gRGVsIDAgYWwgNSwgwr9DdcOhbnRvIHRpZW1wbyBtw6FzIHRlIG1hbnR1dm8gZW4gY2FzYT8iLAogICAgICAgIGRlY2NlbGVyYXRpb24gPSAiwr9RdcOpIGNvbmRpY2lvbmVzIGNyZWVzIHF1ZSBleGlzdGVuIGVuIHR1IGRpc3RyaXRvIHF1ZSByZXRhcmRhbiBsYSBwcm9wYWdhY2nDs24gZGVsIENvdmlkPyIsCiAgICAgICAgYWNjZWxlcmF0aW9uID0gIsK/UXXDqSBjb25kaWNpb25lcyBjcmVlcyBxdWUgZXhpc3RlbiBlbiB0dSBkaXN0cml0byBxdWUgYWNlbGVyYW4gbGEgcHJvcGFnYWNpw7NuIGRlbCBDb3ZpZD8iCiAgICApICU+JQogICAgbXV0YXRlKAogICAgICAgIGdlbmVybyA9IGFzLmZhY3RvcihnZW5lcm8pLAogICAgICAgIGluZ3Jlc28gPSBhcy5mYWN0b3IoaW5ncmVzbyksCiAgICAgICAgZGlzdHJpdG8gPSBhcy5mYWN0b3IoZGlzdHJpdG8pLAogICAgICAgIGVzdHVkaW8gPSBmYWN0b3IoZXN0dWRpbywgbGV2ZWxzID0gYygiU2VjdW5kYXJpYSIsICJUw6ljbmljYSIsICJVbml2ZXJzaXRhcmlhIiwgIlBvc2dyYWRvIikpLAogICAgICAgIGVtcGxlbyA9IGZhY3RvcihlbXBsZW8sIGxldmVscyA9IGMoIk5vIHRyYWJham8iLCAiSW5mb3JtYWwiLCAiRm9ybWFsIikpLAogICAgICAgICMgRXN0ZWJhbiBOaWNvbGFzIFZpbGxhY29ydGEgR2FyY2lhIGNhbWJpw7MgbGFzIHJlc3B1ZXN0YXMgZGUgbGEgZW5jdWVzdGEKICAgICAgICAjIGRlICJNYXlvciA1IiBhIDYuCiAgICAgICAgc2FsaWRhc18gPSBzYWxpZGFzLAogICAgICAgIHNhbGlkYXMgPSByZXBsYWNlKHNhbGlkYXMsIHNhbGlkYXM9PSI2IiwgIk1heW9yIDUiKSwKICAgICAgICBzYWxpZGFzID0gZmFjdG9yKHNhbGlkYXMsIGxldmVscyA9IGMoMDo1LCAiTWF5b3IgNSIpKSwKICAgICAgICByYXpvbmVzID0gc3Ryc3BsaXQocmF6b25lcywgIiwgIiksCiAgICAgICAgc29jaWFsLmJvb2wgPSBzb2NpYWwuYm9vbCA9PSAiU8OtIiB8IHNvY2lhbC5ib29sID09ICJTaSIsCiAgICAgICAgb2Npby5ib29sID0gb2Npby5ib29sID09ICJTw60iIHwgb2Npby5ib29sID09ICJTaSIsCiAgICAgICAgbm9kYXkuYm9vbCA9IG5vZGF5LmJvb2wgPT0gIlPDrSIgfCBub2RheS5ib29sID09ICJTaSIsCiAgICAgICAgbXVsdGEuYm9vbCA9IG11bHRhLmJvb2wgPT0gIlPDrSIgfCBtdWx0YS5ib29sID09ICJTaSIsCiAgICAgICAgYm9uby5ib29sID0gYm9uby5ib29sID09ICJTw60iIHwgYm9uby5ib29sID09ICJTaSIsCiAgICAgICAgYWZwMS5ib29sID0gYWZwMS5ib29sID09ICJTw60iIHwgYWZwMS5ib29sID09ICJTaSIsCiAgICAgICAgYWZwMi5ib29sID0gYWZwMi5ib29sID09ICJTw60iIHwgYWZwMi5ib29sID09ICJTaSIsCiAgICAgICAgYWNjZWxlcmF0aW9uID0gc3Ryc3BsaXQoYWNjZWxlcmF0aW9uLCAiLCAiKSwKICAgICAgICBkZWNjZWxlcmF0aW9uID0gc3Ryc3BsaXQoZGVjY2VsZXJhdGlvbiwgIiwgIikKICAgICkgLT4gZGZfZm9ybTIKZGZfZm9ybTIKYGBgCgojIyMgRWRhZCBkZSBsYSBtdWVzdHJhCmBgYHtyfQpzdW1tYXJ5KGRmX2Zvcm0yJGVkYWQpCmJveHBsb3QoZGZfZm9ybTIkZWRhZCwgeGxhYiA9ICIiLCB5bGFiID0gIkVkYWQiLCBtYWluPU5VTEwpCnRpdGxlKCJHcsOhZmljbyAxLiBFZGFkIikKYGBgCgokJG4gPSAzMTAsIHNkID0gMTIuNjE5JCQKCiMjIyBHw6luZXJvCmBgYHtyfQpkZl9mb3JtMiAlPiUKICAgIGdyb3VwX2J5KGdlbmVybykgJT4lCiAgICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lCiAgICBiYXJwbG90KG5+Z2VuZXJvLCBkYXRhPS4sIHhsYWI9IlBlcnNvbmFzIiwgeWxhYj0iQ2FudGlkYWQiKQoKdGl0bGUoIkdyw6FmaWNvIDIuIEfDqW5lcm8iKQpgYGAKCiMjIyBJbmdyZXNvIHByb21lZGlvCgpgYGB7cn0KcGFyKG1haSA9IGMoMC44LCAxLjUsIDAuMiwgMC41KSkKZGZfZm9ybTIgJT4lCiAgICBncm91cF9ieShpbmdyZXNvKSAlPiUKICAgIHN1bW1hcmlzZShuID0gbigpKSAlPiUKICAgIGJhcnBsb3Qobn5pbmdyZXNvLCBkYXRhPS4sIGhvcml6ID0gVFJVRSwgbGFzID0gMiwgeGxhYiA9ICJQZXJzb25hcyIsIHlsYWI9IiIpCnRpdGxlKHlsYWI9IkluZ3Jlc28iLCBsaW5lPTYpCnRpdGxlKCJHcsOhZmljbyAzLiBJbmdyZXNvcyIpCmBgYAoKIyMjIERpc3RyaXRvCmBgYHtyLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9MjB9CnBhcihtYWkgPSBjKDEsIDIsIDAuNSwgMC41KSkKI3Bsb3QoZWRhZH5kaXN0cml0bywgZGF0YSA9IGRmX2Zvcm0yLCBob3Jpem9udGFsPVRSVUUsIGxhcz0yLCB4bGFiPSIiKQojdGl0bGUoeWxhYj0iRGlzdHJpdG8iLCBsaW5lPTgpCgpkZl9mb3JtMiRkaXN0cml0byAlPiUKICAgIHRhYmxlKCkgJT4lCiAgICBzb3J0KFRSVUUpICU+JQogICAgYmFycGxvdChob3JpeiA9IFRSVUUsIGxhcyA9IDIsIHhsYWIgPSAiUGVyc29uYXMiLCB5bGFiPSIiKQp0aXRsZSgiR3LDoWZpY28gNC4gRGlzdHJpdG8iKQpgYGAKCiMjIyBFbXBsZW8KYGBge3J9CnBhcihtYWkgPSBjKDEsIDEuNSwgMC41LCAwLjUpKQpkZl9mb3JtMiRlbXBsZW8gJT4lCiAgICB0YWJsZSgpICU+JQogICAgc29ydChUUlVFKSAlPiUKICAgIGJhcnBsb3QoaG9yaXogPSBUUlVFLCBsYXMgPSAyLCB4bGFiID0gIlBlcnNvbmFzIiwgeWxhYj0iIikKCnRpdGxlKCJHcsOhZmljbyA1LiBUaXBvIGRlIHRyYWJham8iKQpgYGAKCiMjIyDCv1F1w6kgdGFudG8gdmFyw61hbiBsYXMgY2lmcmFzIGRlIG51ZXZvcyBpbmZlY3RhZG9zIGR1cmFudGUgbG9zIHBlcmlvZG9zIGRlIGluc3RhdXJhY2nDs24gcHJldmlvcy1wb3N0ZXJpb3JlcyBhIGxhIG1lZGlkYT8KClBhcmEgZXN0YSBwcmltZXJhIHByZWd1bnRhIHNlIGhhbiBwcm9jZXNhZG8gbG9zIGRhdG9zIHdlYi4gU2UgcHJlc2VudGFyw6FuIGRvcyBncsOhZmljb3MgcG9yIGNhZGEgdW5hIGRlIGxhcyBjdWF0cm8gbWVkaWRhcyBxdWUgc2UgYW5hbGl6YXLDoW4uIEVsIHByaW1lcm8gZGUgZWxsb3Mgc2Vyw6EgZGUgbG9zIG51ZXZvcyBjYXNvcyB5IGVsIHNlZ3VuZG8gZGUgbGEgbW92aWxpemFjacOzbiByZWNyZWFjaW9uYWwgKGNhbWJpb3MgZW4gbGEgbW92aWxpemFjacOzbikuIExvcyBkZXNjcmlwdG9yZXMgcXVlIHNlIGVzdMOhbiB1dGlsaXphbmRvIHBhcmEgZGVzY3JpYmlyIG1lam9yIGxvcyBkYXRvcyBvYnRlbmlkb3MgZXMgbGEgbWVkaWEgeSBtZWRpYW5hLiBFcyBuZWNlc2FyaW8gZGVzdGFjYXIgcXVlIHNlIGhhIG9wdGFkbyBwb3IgZ3JhZmljYXIgbG9zIGRhdG9zIGRpZXogZMOtYXMgYW50ZXMgZGUgcXVlIHNlIGRlY3JldGUgbGEgbWVkaWRhIHkgZGlleiBkw61hcyBkZXNwdcOpcyBkZSBoYWJlcnNlIHByb211bGdhZG8uCgojIyMgRnJlY3VlbmNpYSBkZSBzYWxpZGFzIFZTIGluZ3Jlc29zCmBgYHtyfQpnZ3Bsb3QoYWVzKHggPSBzYWxpZGFzXywgeSA9IGluZ3Jlc28pLCBkYXRhID0gZGZfZm9ybTIpICsKICAgIGdlb21fYm94cGxvdCgpICsKICAgIGdndGl0bGUoIlNhbGlkYXMgdnMgaW5ncmVzb3MiKSArCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkKYGBgCgojIERlY2xhcmFjacOzbiBkZWwgRXN0YWRvIGRlIEVtZXJnZW5jaWEKCkVuIGVzdGEgZ3LDoWZpY2EgcG9kZW1vcyB2aXN1YWxpemFyIHF1ZSBsYSBjYW50aWRhZCBkZSBpbmZlY3RhZG9zIHBvciBkw61hIGJhasOzIGVuIGFsZ3Vub3MgZMOtYXMgaW5tZWRpYXRhbWVudGUgZGVzcHXDqXMgZGUgcXVlIHNlIGRlY2xhcmFyw6EgZWwgZXN0YWRvIGRlIGVtZXJnZW5jaWEuIFNlIHB1ZWRlIGFwcmVjaWFyIGVuIGxhIGdyw6FmaWNhIHF1ZSBzZSBsbGV2YSBhIGNhYm8gY2FkYSAyIG8gMyBkw61hcyBkdXJhbnRlIGxhIHNlbWFuYSBzaWd1aWVudGUgYSBsYSBpbXBsZW1lbnRhY2nDs24gZGVsIEVzdGFkbyBkZSBFbWVyZ2VuY2lhLiBFc3RvIHNlIHBvZHLDrWEgZGViZXIgYSBmYWN0b3JlcyBjb21vIGxhIGNhbnRpZGFkIGRlIHBydWViYXMgdG9tYWRhcyBwb3IgZMOtYSwgZnJlY3VlbmNpYSBkZSBzYWxpZGEgZGUgbGFzIHBlcnNvbmFzIHkgZWwgY3VtcGxpbWllbnRvIGRlIGxhcyBsZXllcyB5IG1lZGlkYXMgdG9tYWRhcy4KCmBgYHtyLGVjaG89RkFMU0UsbWVzc2FnZT1GQUxTRSxyZXN1bHRzPSJhc2lzIn0KY2F0X3Bsb3QobHVicmlkYXRlOjp5bWQoIjIwMjAtMDMtMTUiKSwgMTAsICJHcsOhZmljbyA2LiBEZWNsYXJhY2nDs24gZGVsIGVzdGFkbyBkZSBFbWVyZ2VuY2lhIiwgcGxvdF9uZXdfY2FzZXMsICJOdWV2b3MgY2Fzb3MiKQpgYGAKUGFyYSBhbmFsaXphciBlc3RhIGdyw6FmaWNhLCBzZSBhc3VtZSBxdWUgZWwgY3JlY2ltaWVudG8gZGUgbGEgZW5mZXJtZWRhZCBiYWpvIGNvbmRpY2lvbmVzIG5vcm1hbGVzIGVzIGV4cG9uZW5jaWFsLiBQb3IgdGFudG8sIHNlIHB1ZWRlIGNvbnN0cnVpciB1biBtb2RlbG8gdGFsIHF1ZToKbG4oeSkgfiBBdCtCLiBUb21hbmRvIGEgTDEgY29tbyByZWdyZXNpw7NuIGRlIGNvbnRyb2wgc2luIHZhcmlhYmxlIGluZGVwZW5kaWVudGUgeSBMMiBsYSByZWdyZXNpw7NuIGx1ZWdvIGRlIGFwbGljYXJzZSBsYSBtZWRpZGEsIHNlIHJlYWxpesOzIHVuIEYtdGVzdCBwYXJhIGNvbXByb2JhciBzaSBlbCBtb2RlbG8gTDEgbW9kZWxhIGEgTDIgc2luIGRpZmVyZW5jaWFzIHNpZ25pZmljYXRpdmFzLgoKKiBIbyA6IE5vIGV4aXN0ZW4gZGlmZXJlbmNpYXMgc2lnbmlmaWNhdGl2YXMgZW50cmUgYW1ib3MgbW9kZWxvcy4KKiBIYSA6IEV4aXN0ZW4gZGlmZXJlbmNpYXMgc2lnbmlmaWNhdGl2YXMgZW50cmUgZWwgbW9kZWxvIGFudGVyaW9yIGEgbGEgbWVkaWRhIHkgZWwgYWN0dWFsLgoKfEYgLSBUZXN0IFR3byAtIFNhbXBsZSBmb3IgVmFyaWFuY2VzIHwKfC0tLXwtLS0tLS0tLS0tfC0tLS0tLXwKfCB8IFZhcmlhYmxlIDF8IFZhcmlhYmxlIDIgfAp8LS0tfC0tLS0tLS0tLS18LS0tLS0tfAp8TWVhbiAgfDEuNTU5NTAzNTV8IDMuNjAzNTc3OTQ2fAp8VmFyaWFuY2UgIHwxLjMwNzUxNDIzfCAwLjIwMTY3ODg1NHwKfE9ic2VydmF0aW9ucyB8MTB8IDl8CnxkZiAgfDl8IDh8CnxGICB8Ni40ODMxNDk4NHwgfAp8UCAoRiA8PSBmKSBvbmUtdGFpbCAgfDAuMDA3NDY2Mjl8IHwKfEYgY3LDrXRpY28gb25lLXRhaWwgIHwzLjM4ODEzMDIzfCB8CnwtLS18LS0tLS0tLS0tLXwtLS0tLS18CgpEYWRvIHF1ZSBsYSB2YXJpYW56YSAxID4gdmFyaWFuemEgMiwgbGEgZWxlY2Npw7NuIGRlbCBvcmRlbiBkZSBsYXMgdmFyaWFibGVzIGVzIGNvcnJlY3RhLiBQb3IgdGFudG8sIGRhZG8gRiA+IEYgY3LDrXRpY28sIHNlIGVuY3VlbnRyYSBldmlkZW5jaWEgcGFyYSBmYWxzZWFyIEhvLiBEYWRvIM6xID4gUChGPD1mKSB1bmEgY29sYSwgc2UgcmVjaGF6YSBsYSBoaXDDs3Rlc2lzIG51bGEsIHBvciBsbyBxdWUgZXhpc3RlbiBkaWZlcmVuY2lhcyBzaWduaWZpY2F0aXZhcy4gQ29tcGFyYW5kbyBsYXMgcGVuZGllbnRlcyBBMT0wLjMzNyB5IEEyPTAuMDcyOSBjb24gQTIgPEExLCBzZSBwdWVkZSBhc3VtaXIgcXVlIHNlIGZyZW7DsyBsYSBleHBhbnNpw7NuIGRlIGxhIGVuZmVybWVkYWQuCgpgYGB7cixlY2hvPUZBTFNFLG1lc3NhZ2U9RkFMU0UscmVzdWx0cz0iYXNpcyJ9CmNhdF9wbG90KGx1YnJpZGF0ZTo6eW1kKCIyMDIwLTAzLTE1IiksIDEwLCAiR3LDoWZpY28gNy4gRGVjbGFyYWNpw7NuIGRlbCBlc3RhZG8gZGUgRW1lcmdlbmNpYSIsIHBsb3Rfcm1vdmVzLCAiTW92aWxpemFjacOzbiByZWNyZWFjaW9uYWwiKQpgYGAKQSBwYXJ0aXIgZGVsIGdyw6FmaWNvIDcsIHNlIGxvZ3JhIHZpc3VhbGl6YXIgcXVlIHByZXZpbyBhIGxhIHByb211bGdhY2nDs24gZGUgbGEgbWVkaWRhIOKAnERlY2xhcmFjacOzbiBkZSBFc3RhZG8gZGUgRW1lcmdlbmNpYeKAnSwgbGEgZ2VudGUgdGVuw61hIG11Y2hhIG3DoXMgbW92aWxpemFjacOzbiB5IGx1ZWdvIGRlIGRlY3JldGFkYSwgZWwgY2FtYmlvIGRlIG1vdmlsaXphY2nDs24gZGlzbWludXnDsyBlbiBncmFuIG1lZGlkYS4gRWwgcHJvbWVkaW8geSBtZWRpYW5hIChsw61uZWFzIGNvbnRpbnVhcykgYW50ZXMgZGUgcXVlIHNlIGFwbGlxdWUgZXN0YSBtZWRpZGEgZXMgYXByb3hpbWFkYW1lbnRlIC0zLiBQb3Igb3RybyBsYWRvLCBlbCBwcm9tZWRpbyB5IG1lZGlhbmEgKGzDrW5lYXMgcHVudGVhZGFzKSBkZXNkZSBlbCBxdWluY2UgaGFzdGEgZWwgdmVpbnRpY2luY28gZXN0w6EgcG9yIGRlYmFqbyBkZSAtNjAuCgpQYXJhIGNvbXByb2JhciBsYSBzaWduaWZpY2FuY2lhIGRlIGVzdGEgZGlmZXJlbmNpYSwgc2UgcmVhbGl6w7MgdW4gdGVzdC10IGRlIG1lZGlhcy4gU2UgYXN1bWllcm9uIGxhcyBzaWd1aWVudGVzIGhpcMOzdGVzaXM6CgoqIEhvIDogTm8gZXhpc3RlIHVuIGVmZWN0byBzaWduaWZpY2F0aXZvIGRlIGxhIG1lZGlkYSBwb3Igc29icmUgbGFzIG1lZGlhcyBkZWwgQ2FtYmlvIGRlIE1vdmlsaXphY2nDs24uCiogSGEgOiBFeGlzdGVuIGRpZmVyZW5jaWFzIHNpZ25pZmljYXRpdmFzIGVudHJlIGxhcyBtZWRpYXMgZGUgbGEgdmFyaWFibGUgQ2FtYmlvIGRlIE1vdmlsaXphY2nDs24gcGFyYSBhbnRlcyB5IGRlc3B1w6lzIGRlIGVqZWN1dGFyc2UgbGEgbWVkaWRhLgoKfHQgLSBUZXN0IFR3byBBc3N1bWluZyBVbmVxdWFsIFZhcmlhbmNlcyB8CnwtLS18LS0tLS0tLS0tLXwtLS0tLS18CnwgfCBWYXJpYWJsZSAxfCBWYXJpYWJsZSAyIHwKfC0tLXwtLS0tLS0tLS0tfC0tLS0tLXwKfE1lYW4gIHwtMy4zNjM2MzYzNjR8IC03MS4xODE4MTgyfAp8VmFyaWFuY2UgIHwxNS42NTQ1NDU0NXwgMTEzLjM2MzYzNnwKfE9ic2VydmF0aW9ucyB8MTF8IDExfAp8ZGYgIHwxM3wgfAp8dCBTdGF0ICB8MTkuODAyMzYzNHwgfAp8UCAoVCA8PSB0KSBvbmUtdGFpbCAgfDIuMTUyNjFFLTExfCB8Cnx0IGNyw610aWNhbCBvbmUtdGFpbCAgfDEuNzcwOTMzMzk2fCB8CnxQIChUIDw9IHQpIHR3by10YWlsICB8NC4zMDUyMUUtMTF8IHwKfHQgY3LDrXRpY2FsIHR3by10YWlsICB8Mi4xNjAzNjg2NTZ8IHwKfC0tLXwtLS0tLS0tLS0tfC0tLS0tLXwKCkRhZG8gcXVlIGVsIHZhbG9yIHx0fCA+IHQtY3LDrXRpY28gZG9zIGNvbGFzLCBzZSBwdWVkZSBlbmNvbnRyYXIgZXZpZGVuY2lhIHBhcmEgcmVjaGF6YXIgbGEgaGlww7N0ZXNpcyBudWxhIEhvLiBEYWRvIM6xID0wLjA1ID4gUChUPD10KSBkb3MgY29sYXMsIGV4aXN0ZSBzaWduaWZpY2FuY2lhIHN1ZmljaWVudGUgcGFyYSBlbGxvLiBQb3IgdGFudG8sIHNlIHJlY2hhemEgSG8sIGV4aXN0aWVuZG8gcG9yIHRhbnRvIGRpZmVyZW5jaWFzIHNpZ25pZmljYXRpdmFzIGVudHJlIGFudGVzIGRlIGVqZWN1dGFyc2UgbGEgZGVjbGFyYWNpw7NuIGRlIEVzdGFkbyBkZSBFbWVyZ2VuY2lhIHkgZGVzcHXDqXMgc29icmUgbGEgbW92aWxpemFjacOzbiBkZSBsYXMgcGVyc29uYXMuIERlYmlkbyBhIHF1ZSBlbCBjb2VmaWNpZW50ZSBkZSBjb3JyZWxhY2nDs24gZXMgbWVub3IgYSAwLCBzZSBwdWVkZSBhZmlybWFyIHF1ZSBlbCBjYW1iaW8gYWRlbcOhcyByZWR1am8gbGEgbW92aWxpemFjacOzbi4KCiMjIEFwcm9iYWNpw7NuIGRlbCBQYWRyw7NuIGRlIEhvZ2FyZXMKCkVzdGUgZ3LDoWZpY28gbm9zIG11ZXN0cmEgbGEgY2FudGlkYWQgZGUgY2Fzb3MgZGlleiBkw61hcyBhbnRlcyB5IGRpZXogZMOtYXMgZGVzcHXDqXMgZGUgcXVlIGxhIG1lZGlkYSDigJxBcHJvYmFjacOzbiBkZWwgUGFkcsOzbiBkZSBIb2dhcmVz4oCdIGZ1ZXJhIGFwcm9iYWRhLiBFc3RhIGVzIHVuYSBncsOhZmljYSBtdXkgaW1wb3J0YW50ZSwgZGFkbyBxdWUgdGVuw61hIGNvbW8gb2JqZXRpdm8gYXl1ZGFyIGEgbGFzIHBvYmxhY2lvbmVzIG3DoXMgdnVsbmVyYWJsZXMgZW4gY29uZGljacOzbiBkZSBleHRyZW1hIHBvYnJlemEgYSBuaXZlbCBuYWNpb25hbCBwYXJhIHF1ZSBwdWRpZXJhbiBzdWJzaXN0aXIgZHVyYW50ZSBsYSBjdWFyZW50ZW5hLiBEaWNobyBlbiBvdHJhcyBwYWxhYnJhcywgcGFyYSBxdWUgcHVkaWVyYW4gYWNjZWRlciBhIGxvcyBzZXJ2aWNpb3MgYsOhc2ljb3MgeSBtZWRpY2FtZW50b3MsIGVuIGNhc28gZnVlc2VuIHJlcXVlcmlkb3MuIExhIGNhbnRpZGFkIGRlIGNhc29zIGFudGVzIGRlIHF1ZSBsYSBtZWRpZGEgZnVlc2UgZGVjbGFyYWRhLCAwOC8wMyBoYXN0YSAxOC8wMywgIHZhIGRlc2RlIGFwcm94aW1hZGFtZW50ZSB1bm8gaGFzdGEgdmVpbnRlLiBObyBvYnN0YW50ZSwgZGVzZGUgMTgvMDMgaGFzdGEgMjgvMDMgbGEgY2FudGlkYWQgZGUgY2Fzb3MgdmEgZW4gYXVtZW50by4gU2luIGR1ZGEgYWxndW5hLCBlbCBvYmpldGl2byBlcmEgYnVlbm8sIHBlcm8gcGFyYSBlbCBwYW5vcmFtYSBxdWUgc2UgZXN0YWJhIHZpdmllbmRvIG5vIGZ1ZSBlZmVjdGl2YS4gVW5hIHBvc2libGUgaGlww7N0ZXNpcyBzZXLDrWEgbGEgc2FsaWRhIG9ibGlnYXRvcmlhIGRlIGxvcyBiZW5lZmljaWFyaW9zIGEgbG9zIGJhbmNvcyBhIGZvcm1hciBsYXJnYXMgY29sYXMgZHVyYW50ZSBob3Jhcy4gRXN0byBleHBsaWNhcsOtYSBlbCBhdW1lbnRvIGRlIGNhc29zLgoKYGBge3IsZWNobz1GQUxTRSxtZXNzYWdlPUZBTFNFLHJlc3VsdHM9ImFzaXMifQpjYXRfcGxvdChsdWJyaWRhdGU6OnltZCgiMjAyMC0wMy0xOCIpLCAxMCwgIkdyw6FmaWNvIDguIEFwcm9iYWNpw7NuIGRlbCBQYWRyw7NuIGRlIEhvZ2FyZXMiLCBwbG90X25ld19jYXNlcywgIk51ZXZvcyBjYXNvcyIpCmBgYApTZSByZWFsaXrDsyB1biBmLXRlc3Qgc29icmUgbG9zIGlucHV0cyBhIGxhIHJlZ3Jlc2nDs24gbGluZWFsIGRlbCBsb2dhcml0bW8gZGUgbGEgZ3LDoWZpY2EsIHNpZ3VpZW5kbyBlbCBtb2RlbG8gcGxhbnRlYWRvIGFycmliYS4gU2UgY29sb2PDsyBjb21vIGNvbnRyb2wgYSB0b2RvcyBsb3MgZGF0b3MgcHJldmlvcyBhIGRlY2xhcmFyc2UgbGEgbWVkaWRhLiBTZSBwbGFudGVhcm9uIGxhcyBzaWd1aWVudGVzIGhpcMOzdGVzaXM6CgoqIEhvIDogTm8gZXhpc3RlIHVuIGVmZWN0byBzaWduaWZpY2F0aXZvIGRlIGxhIG1lZGlkYSBwb3Igc29icmUgbGEgdGVuZGVuY2lhIGRlIGxvcyBudWV2b3MgY2Fzb3MgY29uIHJlc3BlY3RvIGFsIGNvbnRyb2wuCiogSGEgOiBFeGlzdGVuIHVuIGVmZWN0byBzaWduaWZpY2F0aXZvIGVudHJlIGxhcyBtdWVzdHJhcyBkZSBjb250cm9sIHkgbGEgZGF0YSBwb3N0ZXJpb3IgYSBsYSBkZWNsYXJhY2nDs24uCgp8RiAtIFRlc3QgVHdvIC0gU2FtcGxlIGZvciBWYXJpYW5jZXMgfAp8LS0tfC0tLS0tLS0tLS18LS0tLS0tfAp8IHwgVmFyaWFibGUgMXwgVmFyaWFibGUgMiB8CnwtLS18LS0tLS0tLS0tLXwtLS0tLS18CnxNZWFuICB8MS41Mzg4Nzl8IDMuMjE4MTIyfAp8VmFyaWFuY2UgIHwwLjk0OTMyOXwgMC4xNDg5MDd8CnxPYnNlcnZhdGlvbnMgfDEwfCAxMHwKfGRmICB8OXwgOXwKfEYgIHw2LjM3NTMyMXwgfAp8UCAoRiA8PSBmKSBvbmUtdGFpbCAgfDAuMDA4Mzk4fCB8CnxGIGNyw610aWNvIG9uZS10YWlsICB8My40MzgxMDF8IHwKfC0tLXwtLS0tLS0tLS0tfC0tLS0tLXwKCkRhZG8gcXVlIGxhIHByaW1lcmEgdmFyaWFuemEgZXMgbWF5b3IgYSBsYSBzZWd1bmRhLCBlbCBvcmRlbiBkZSBvcGVyYWNpw7NuIGRlIGxvcyBkYXRvcyBlcyBjb3JyZWN0by4gQ29tbyB0YWwsIGRhZG8gRiA+IEYtY3JpdGljbyB1bmEgY29sYSwgZW5jb250cmFtb3MgZXZpZGVuY2lhIGVuIGNvbnRyYSBkZSBIby4gRGFkbyBhZGVtYXMgUChGPD1mKSA8IM6xICwgc2UgcHVlZGUgZ2FyYW50aXphciBsYSBkZWNpc2nDs24gZGUgcmVjaGF6YXIgbGEgaGlww7N0ZXNpcyBudWxhLCBwb3IgbG8gcXVlIGRlYmVuIGV4aXN0aXIgZGlmZXJlbmNpYXMgc2lnbmlmaWNhdGl2YXMgZW50cmUgbG9zIGRhdG9zLiBEYWRvIGFkZW3DoXMgQTE9IDAuMjY3MiA+IEEyPTAuMDExNiwgc2UgcHVlZGUgYWZpcm1hciBxdWUgbGEgbWVkaWRhIHJlZHVqbyBsYSB0YXNhIGRlIGluZmVjY2nDs24uCgpgYGB7cixlY2hvPUZBTFNFLG1lc3NhZ2U9RkFMU0UscmVzdWx0cz0iYXNpcyJ9CmNhdF9wbG90KGx1YnJpZGF0ZTo6eW1kKCIyMDIwLTAzLTE4IiksIDEwLCAiR3LDoWZpY28gOS4gQXByb2JhY2nDs24gZGVsIFBhZHLDs24gZGUgSG9nYXJlcyIsIHBsb3Rfcm1vdmVzLCAiTW92aWxpemFjacOzbiByZWNyZWFjaW9uYWwiKQpgYGAKRXN0YSBncsOhZmljYSwgYWwgaWd1YWwgcXVlIGxhIEdyw6FmaWNhIDcsIG1hbmlmaWVzdGEgdW4gY29tcG9ydGFtaWVudG8gc2ltaWxhci4gU2luIGVtYmFyZ28sIGEgcGFydGlyIGRlIGxhIGRpc21pbnVjacOzbiBkZSBsYSBjdXJ2YSBzZSBwb2Ryw61hbiBnZW5lcmFyIGFsZ3VuYXMgY29uamV0dXJhcy4gTGEgcHJpbWVyYSBkZSBlbGxhcyBlcyBxdWUgbGFzIHBlcnNvbmFzIHRlbsOtYW4gdW4gcmVzcGFsZG8gcGFyYSBwb2RlciBjb21wcmFyIHN1cyBhbGltZW50b3MgeSBtZWRpY2FtZW50b3MgZGUgc2VyIG5lY2VzYXJpbyBwb3IgbG8gcXVlIHlhIG5vIHRlbsOtYW4gcXVlIHNhbGlyIGEgbGFzIGNhbGxlcyBkZSBtYW5lcmEgY29uY3VycmlkYSBhIHZlbmRlciBwcm9kdWN0b3MsIGVudHJlIG90cmFzIGNvc2FzLiBDYWJlIHJlc2FsdGFyIHF1ZSBjb24gZXN0byBubyBxdWVyZW1vcyBkZWNpciBxdWUgbGEgcG9ibGFjacOzbiBubyBzYWzDrWEgeSBxdWUgbGEgbWVkaWRhIGZ1ZSAxMDAlIGVmZWN0aXZhLiBBbCBjb250cmFyaW8sIGxhIHBvYmxhY2nDs24gb2JqZXRpdm8gc2FsacOzIHBhcmEgaGFjZXIgZWwgcmV0aXJvIGRlbCBzdWJzaWRpbyBwb3IgbG8gcXVlIGVsIG7Dum1lcm8gZGUgY2Fzb3MgYXVtZW50w7MuIFNpbiBlbWJhcmdvLCBlc3RvIHRhbWJpw6luIGNvbnRyaWJ1ecOzIGEgcXVlIGVuIGTDrWFzIHBvc3RlcmlvcmVzIHNlIHF1ZWRlbiBlbiBjYXNhLCBkZWJpZG8gYSBxdWUgY29udGFiYW4gY29uIGRpbmVybyBwYXJhIHN1YnNpc3RpciBwb3IgdW4gcGFyIGRlIHNlbWFuYXMgbcOhcyAodmFyw61hIHNlZ8O6biBlbCBuw7ptZXJvIGRlIGludGVncmFudGVzKS4gRXN0YXMgYWZpcm1hY2lvbmVzIHNlIHJlc3BhbGRhbiBjb24gbGEgbWVkaWEgeSBtZWRpYW5hIGFudGVzIGRlbCBkZWNyZXRvIChsw61uZWFzIGNvbnRpbnVhcyksIGRhZG8gcXVlIHNlIHViaWNhIGVuIGxhIHBhcnRlIHN1cGVyaW9yIGRlbCBncsOhZmljbywgbWllbnRyYXMgcXVlIGxhIG1lZGlhIHkgbWVkaWFuYSAobMOtbmVhcyBwdW50ZWFkYXMpIHBvciBkZWJham8gZGUgLTYwLgoKVXRpbGl6YW5kbyB1biB0ZXN0LXQgcGFyYSBtZWRpYXMgZW4gYW1iYXMgc2VjY2lvbmVzIGRlIGxhIGdyw6FmaWNhLCBwb2RlbW9zIGRldGVybWluYXIgc2kgZXhpc3RlIHVuIGVmZWN0byBkZSBsYSBtZWRpZGEgcG9yIHNvYnJlIGxhIHRyZW5kIGdlbmVyYWwuCgoqIEhvIDogTm8gIGV4aXN0ZW4gZGlmZXJlbmNpYXMgc2lnbmlmaWNhdGl2YXMgZW50cmUgYW1iYXMgc2VjY2lvbmVzIGRlIGxhIGdyw6FmaWNhLgoqIEhhIDogRXhpc3RlbiBkaWZlcmVuY2lhcyBzaWduaWZpY2F0aXZhcyBlbnRyZSBhbWJhcyBzZWNjaW9uZXMgZGUgbGEgZ3LDoWZpY2EuCgp8dCAtIFRlc3QgVHdvIFNhbXBsZSBBc3N1bWluZyBVbmVxdWFsIFZhcmlhbmNlcyB8CnwtLS18LS0tLS0tLS0tLXwtLS0tLS18CnwgfCBWYXJpYWJsZSAxfCBWYXJpYWJsZSAyfAp8LS0tfC0tLS0tLS0tLS18LS0tLS0tfAp8TWVhbiAgfC05LjMzMzMzMzMzfCAtNzQuNXwKfFZhcmlhbmNlICB8MTM1fDUuMzg4ODg4ODg5fAp8T2JzZXJ2YXRpb25zIHw5fCAxMHwKfEh5cG90aGVzaXplZCBNZWFuIERpZmZlcmVuY2UgIHwwfCB8CnxkZiB8OXwgfAp8dCBTdGF0ICB8MTYuNTMxNjI0Mjh8IHwKfFAoVCA8PSB0KSBvbmUgLSB0YWlsICB8Mi40MTc4MUUtMDh8IHwKfHQgQ3JpdGljYWwgb25lIC0gdGFpbCB8MS44MzMxMTI5MzN8IHwKfFAoVCA8PSB0KSB0d28gLSB0YWlsICB8NC44MzU2M0UtMDh8IHwKfHQgQ3JpdGljYWwgdHdvIC0gdGFpbCAgfDIuMjYyMTU3MTYzfCB8CnwtLS18LS0tLS0tLS0tLXwtLS0tLS18CgpEYWRvIHF1ZSBlbCBlc3RhZMOtc3RpY28gfHR8ID4gdC1jcsOtdGljbyBkb3MgY29sYXMsIHNlIGVuY3VlbnRyYSBldmlkZW5jaWEgcGFyYSBmYWxzZWFyIGxhIGhpcMOzdGVzaXMgbnVsYS4gRGFkbyBxdWUgUChUPD10KSA8IM6xLCBsYSBlbGVjY2nDs24gZXMganVzdGlmaWNhYmxlLCBwb3IgbG8gcXVlIHNlIHJlY2hhemEgbGEgaGlww7N0ZXNpcyBudWxhLCBjb25jbHV5ZW5kbyBwb3IgdGFudG8gcXVlIGV4aXN0ZSB1bmEgZGlmZXJlbmNpYSBzaWduaWZpY2F0aXZhIGVudHJlIGFtYmFzIHNlY2Npb25lcyBkZSBsYSBncsOhZmljYS4gRGViaWRvIGEgcXVlIGxhIGNvcnJlbGFjacOzbiBlcyBuZWdhdGl2YSwgc2UgY29uY2x1eWUgcXVlIGxhIG1lZGlkYSByZWR1am8gbGEgbW92aWxpemFjaW9uIHJlY3JlYWNpb25hbC4KCiMjIFNhbGlkYSBhbHRlcm5hZGEgcG9yIGfDqW5lcm8KCkVsIGdyw6FmaWNvIDEwIGV4aGliZSBsYSBjYW50aWRhZCBkZSBjYXNvcyBhbnRlcyB5IGRlc3B1w6lzIGRlIGFwbGljYXJzZSBsYSBtZWRpZGEg4oCcU2FsaWRhIGFsdGVybmFkYSBwb3IgZ8OpbmVyb+KAnS4gRW4gdW4gcHJpbWVyIG1vbWVudG8gZXN0YSBtZWRpZGEgdGVuw61hIGNvbW8gb2JqZXRpdm8gZGlzbWludWlyIGVsIG7Dum1lcm8gZGUgY29udGFnaW9zLiBQb3IgdGFsIHJhesOzbiwgZWwgR29iaWVybm8gZGVjcmV0w7MgZGV0ZXJtaW5hZG9zIGTDrWFzIGRlIHNhbGlkYSBwYXJhIG11amVyZXMgeSBvdHJvcyBwYXJhIHZhcm9uZXMsIHkgbG9zIGRvbWluZ29zIG5hZGllIHNhbMOtYS4gTm8gb2JzdGFudGUsIGEgcGFydGlyIGRlIGxhIHJlcHJlc2VudGFjacOzbiBzZSBwdWVkZSBvYnNlcnZhciBxdWUgZWwgbsO6bWVybyBkZSBjYXNvcyBhdW1lbnTDsyBkZSBhcHJveGltYWRhbWVudGUgY2llbiBhIG1pbCBjaWVuIGNhc29zLiBEZXNwdcOpcyBkZSBsb3MgcmVwb3J0YWplcyB2aXN0b3MsIHBvZHLDrWFtb3MgdHJhdGFyIGRlIGV4cGxpY2FyIGVzdGUgY29tcG9ydGFtaWVudG8gYmFzw6FuZG9ub3MgZW4gbG8gc2lndWllbnRlOiBsYXMgbWFtw6FzIGNvbnNpZGVyYW4gcXVlIGxvcyB2YXJvbmVzIChlc3Bvc29zKSBubyBzYWJlbiBoYWNlciBsYXMgY29tcHJhcyBkZSBtZXJjYWRvLiBBbGd1bm9zIGRpcsOtYW4gcXVlIGVzdG8gbm8gdGllbmUgZnVuZGFtZW50bywgcGVybyBhbmFsaXphbmRvIGRldGFsbGFkYW1lbnRlIGxvcyByZXBvcnRhamVzLCBwdWRpbW9zIHJlY29ub2NlciBxdWUgZW4gbG9zIGTDrWFzIGRlIHNhbGlkYSBkZSBtdWplcmVzIGhhYsOtYSBtdWNoYSBtw6FzIGFnbG9tZXJhY2nDs24geSBkZXNvcmRlbiwgYSBkaWZlcmVuY2lhIGRlIGxvcyBkw61hcyBlbiBxdWUgbGVzIHRvY2FiYSBzYWxpciBhIGxvcyB2YXJvbmVzLgoKYGBge3IsZWNobz1GQUxTRSxtZXNzYWdlPUZBTFNFLHJlc3VsdHM9ImFzaXMifQpjYXRfcGxvdChsdWJyaWRhdGU6OnltZCgiMjAyMC0wNC0wMyIpLCAxMCwgIkdyw6FmaWNvIDEwLiBTYWxpZGEgYWx0ZXJuYWRhIHBvciBnw6luZXJvIiwgcGxvdF9uZXdfY2FzZXMsICJOdWV2b3MgY2Fzb3MiKQpgYGAKUGFyYSBjb21wcm9iYXIgZXN0YWTDrXN0aWNhbWVudGUgc2kgZXMgcXVlIGxhIG1lZGlkYSBmdWUgZWZlY3RpdmEgbyBubywgc2UgcmVhbGl6w7MgZWwgdGVzdCBGIHNvYnJlIGxhIGZvcm1hIGxvZ2Fyw610bWljYSBkZSBsYSByZWdyZXNpw7NuLiBEZWJpZG8gYSBxdWUgbGEgcmVncmVzacOzbiBubyBzZSBjZW50cmEgZW4gMCwgc2Ugbm9ybWFsaXphcm9uIGxvcyBwdW50b3MgcHJldmlhbWVudGUuCgoqIEhvIDogTm8gZXhpc3RlIGRpZmVyZW5jaWFzIHNpZ25pZmljYXRpdmFzIGVudHJlIGxvcyBkb3Mgc2V0cyBkZSBwdW50b3MuCiogSGEgOiBFeGlzdGUgZGlmZXJlbmNpYXMgc2lnbmlmaWNhdGl2YXMgZW50cmUgZWwgc2V0IGRlIHB1bnRvcyBhbnRlcyB5IGRlc3B1ZXMgZGUgYXBsaWNhcnNlIGxhIG1lZGlkYS4KCnxGIC0gVGVzdCBUd28gLSBTYW1wbGUgZm9yIFZhcmlhbmNlcyB8CnwtLS18LS0tLS0tLS0tLXwtLS0tLS18CnwgfCA0LjE1ODg4fCA2LjcxMjk2IHwKfC0tLXwtLS0tLS0tLS0tfC0tLS0tLXwKfE1lYW4gIHw0LjgyMDkzOXwgNi42NjY1NDJ8CnxWYXJpYW5jZSAgfDAuMzY2ODA4fCAwLjE0MDE2OXwKfE9ic2VydmF0aW9ucyB8MTB8IDZ8CnxkZiAgfDl8IDV8CnxGICB8Mi42MTY5MDF8IHwKfFAgKEYgPD0gZikgb25lLXRhaWwgIHwwLjE1MDk0NHwKfEYgY3LDrXRpY28gb25lLXRhaWwgIHw0Ljc3MjQ2NnwgfAp8LS0tfC0tLS0tLS0tLS18LS0tLS0tfAoKRGFkbyBxdWUgRiA8IEYtY3LDrXRpY28gdW5hIGNvbGEsIG5vIHNlIHB1ZWRlIGZhbHNlYXIgbGEgaGlww7N0ZXNpcyBudWxhLiBBZGVtw6FzLCBjb21vUChGPD1mKSB1bmEgY29sYSA+IDAuMDUsIHNlIGRlY2lkZSBtYW50ZW5lciBsYSBoaXDDs3Rlc2lzIG51bGEsIGNvbnNpZGVyYW5kbyBxdWUgbm8gZXhpc3RlbiBkaWZlcmVuY2lhcyBzaWduaWZpY2F0aXZhcy4gQ29uIGVzdG8sIHNlIGNvbXBydWViYSBxdWUgbGEgbWVkaWRhIG5vIHR1dm8gw6l4aXRvIGVuIHJlZHVjaXIgbG9zIG51ZXZvcyBjYXNvcy4KCmBgYHtyLGVjaG89RkFMU0UsbWVzc2FnZT1GQUxTRSxyZXN1bHRzPSJhc2lzIn0KY2F0X3Bsb3QobHVicmlkYXRlOjp5bWQoIjIwMjAtMDQtMDMiKSwgMTAsICJHcsOhZmljbyAxMS4gU2FsaWRhIGFsdGVybmFkYSBwb3IgZ8OpbmVybyIsIHBsb3Rfcm1vdmVzLCAiTW92aWxpemFjacOzbiByZWNyZWFjaW9uYWwiKQpgYGAKU2UgcHVlZGUgb2JzZXJ2YXIgdW4gbGV2ZSBjYW1iaW8gZW4gbGEgcG9zaWNpw7NuIGRlIGxhcyBtZWRpYXMgZGUgYW1ib3MgZGF0YXNldHMuIFBhcmEgY29tcHJvYmFyIGxhIHNpZ25pZmljYW5jaWEgZGUgZXN0YSBkaWZlcmVuY2lhLCBzZSBwbGFudGVhIHVuIHRlc3QtdC4gQXN1bWllbmRvOgoKKiBIbzogTm8gc2UgcHVlZGUgZW5jb250cmFyIGRpZmVyZW5jaWFzIHNpZ25pZmljYXRpdmFzIGVudHJlIGxhcyBkb3MgZmFzZXMuCgoqIEhhOiBFeGlzdGVuIGRpZmVyZW5jaWFzIHNpZ25pZmljYXRpdmFzIGVudHJlIGFudGVzIGRlIGRlY2xhcmFyc2UgbGEgbWVkaWRhIHkgdHJhcyBzdSBlamVjdWNpw7NuLgoKCnx0IC0gVGVzdDogUGFpcmVkIFR3byBTYW1wbGUgZm9yIE1lYW5zIHwKfC0tLXwtLS0tLS0tLS0tfC0tLS0tLXwKfCB8IC03NXwgLTc2IHwKfC0tLXwtLS0tLS0tLS0tfC0tLS0tLXwKfE1lYW4gIHwtNzQuMTExMXwgLTg1LjMzMzN8CnxWYXJpYW5jZSAgfDAuOTIzNjExfCA2OXwKfE9ic2VydmF0aW9ucyB8OXwgOXwKfFBlYXJzb24gQ29ycmVsYXRpb24gIHwtMC42ODYzNXwgfAp8SHlwb3RoZXNpemVkIE1lYW4gRGlmZmVyZW5jZSAgfDh8IHwKfGRmIHw4fCB8Cnx0IFN0YXQgIHwxLjA3NDg1OHwgfAp8UChUIDw9IHQpIG9uZSAtIHRhaWwgIHwwLjE1Njg5MnwgfAp8dCBDcml0aWNhbCBvbmUgLSB0YWlsIHwxLjg1OTU0OHwgfAp8UChUIDw9IHQpIHR3byAtIHRhaWwgIHwwLjMxMzc4NHwgfAp8dCBDcml0aWNhbCB0d28gLSB0YWlsICB8Mi4zMDYwMDR8IHwKfC0tLXwtLS0tLS0tLS0tfC0tLS0tLXwKCgpEYWRvIHF1ZSB8dFN0YXR8IDwgdCBjcml0aWNvIGRvcyBjb2xhcywgbm8gc2UgcHVlZGUgZW5jb250cmFyIGV2aWRlbmNpYSBxdWUgbmllZ3VlIEhvLiBEYWRvIGFkZW3DoXMgcXVlIFAoVDw9dCkgPiDOsSwgbm8gc2UgbGxlZ2EgYSByZWNoYXphciBsYSBoaXDDs3Rlc2lzIG51bGEsIHBvciBsbyBxdWUgc2UgYXN1bWUgcXVlIG5vIGV4aXN0ZW4gZGlmZXJlbmNpYXMgc2lnbmlmaWNhdGl2YXMgdHJhcyBsYSBtZWRpZGEuCgpBIHBhcnRpciBkZSBlc3RlIGdyw6FmaWNvIHNlIHB1ZWRlIG9ic2VydmFyIHVuYSBzaW1pbGl0dWQgZW4gZWwgY29tcG9ydGFtaWVudG8gY29uIHRvZG9zIGxvcyBkZW3DoXMgYW5hbGl6YWRvcyBoYXN0YSBlc3RlIHB1bnRvLiBTaSBiaWVuIGVzIGNpZXJ0byBsYXMgdHJlcyBtZWRpZGFzIGZ1bmNpb25hbiBiaWVuIHBhcmEgZGlzbWludWlyIGxhIG1vdmlsaXphY2nDs24sIHBlcm8gY29uIGVsIG5pdmVsIGRlIGNhc29zIGRlIENvdmlkLTE5IHN1Y2VkZSBsbyBjb250cmFyaW8sIGRhZG8gcXVlIGVzdG9zIGF1bWVudGFuIGRlIG1hbmVyYSBzaWduaWZpY2F0aXZhLiBFcyBuZWNlc2FyaW8gZGVzdGFjYXIgcXVlIGhheSBmZWNoYXMgZW4gbGFzIHF1ZSBkaXNtaW51eWUgeSBvdHJhcyBlbiBsYXMgcXVlIGF1bWVudGEuIE5vIG9ic3RhbnRlLCB1biBjYW1iaW8gbm90b3JpbyBzdWNlZGUgYSBwYXJ0aXIgZGVsIDYgZGUgYWJyaWwsIGRvbmRlIGxhIG1vdmlsaXphY2nDs24gZXN0w6EgcG9yIGRlYmFqbyBkZSAtOTAgYXByb3hpbWFkYW1lbnRlLiBFbCBjYW1iaW8gZGUgbW92aWxpemFjacOzbiBwdWVkZSBlc3RhciBmdW5kYW1lbnRhZGEgcG9ycXVlIHBhcnRlIGRlIGxhIHBvYmxhY2nDs24gbm8gc2Fsw61hIGVsIG1pc21vIGTDrWEuIFBlcm8sIHNpIGRpc21pbnV5w7MgbGEgbW92aWxpemFjacOzbiDCv3BvciBxdcOpIGF1bWVudGFyb24gbG9zIGNhc29zPyBQYXJhIHJlc3BvbmRlciBlc3RhIHByZWd1bnRhLCBub3MgYmFzYXJlbW9zIGVuIGVsIGdyw6FmaWNvIGFudGVyaW9yLCBkb25kZSBvYmpldGFtb3MgcXVlIGxhcyBtYWRyZXMgbm8gcHVlZGVuIGRlamFyIGVsIGNvbnRyb2wgbyBjb25maWFuemEgYSBzdXMgZXNwb3NvcyBwYXJhIHF1ZSBzZSBlbmNhcmd1ZW4gZGUgbGEgZGlzcGVuc2EuIExhIG1heW9yw61hIG9wdGFiYSBwb3Igc2FsaXIgYSBjb21wcmFyIHVuIGTDrWEgaMOhYmlsIHkgbGEgbWlzbWEgYWdsb21lcmFjacOzbiwgZGVzb3JkZW4geSBlbCBubyBkaXN0YW5jaWFtaWVudG8gY29udHJpYnV5ZSBhIGxhIGFjZWxlcmFjacOzbiBkZSBsYSBwcm9wYWdhY2nDs24gZGVsIHZpcnVzLgoKIyMgUGVybWlzbyBkZSBhZHF1aXNpY2nDs24gZGUgYmllbmVzIHkgc2VydmljaW9zIGLDoXNpY29zCgpFbiBlbCBncsOhZmljbyBuw7ptZXJvIDEyIGhheSB1bmEgb2JzZXJ2YWNpw7NuIG11eSBwb2NvIGV2aWRlbnRlIHF1ZSBzZSBwdWVkZSB2ZXIuIFBvY29zIGTDrWFzIGFudGVyaW9yZXMgYSBsYSBpbXBsZW1lbnRhY2nDs24gZGUgbGEgbWVkaWRhIGVuIGNvbnNpZGVyYWNpw7NuLCBsb3MgbnVldm9zIGNhc29zIGVtcGV6YXJvbiBhIGluY3JlbWVudGFyIGRlc3B1w6lzIGRlIGhhYmVyc2UgbWFudGVuaWRvIHJlbGF0aXZhbWVudGUgY29uc3RhbnRlcyBwb3IgdW4gdGllbXBvLiBFbCBpbmNyZW1lbnRvIGRlIGVzdG9zIG51ZXZvcyBjYXNvcyBhbCBwYXJlY2VyIGZ1ZSBjb250cm9sYWRvIHBvciB1bm9zIGRpYXMgcG9zdGVyaW9yZXMgZGUgc2VyIHRvbWFkYSBsYSBtZWRpZGEuIFNpbiBlbWJhcmdvLCBlbiBsYSBncsOhZmljYSBzZSBwdWVkZSB2aXN1YWxpemFyIHF1ZSBhcHJveGltYWRhbWVudGUgdW5hIHNlbWFuYSBkZXNwdcOpcyBkZSBoYWJlcnNlIHRvbWFkbyBlc3RhIG1lZGlkYSBsb3MgY2Fzb3MgZW1wZXphcm9uIGEgaW5jcmVtZW50YXIgbnVldmFtZW50ZS4KCmBgYHtyLGVjaG89RkFMU0UsbWVzc2FnZT1GQUxTRSxyZXN1bHRzPSJhc2lzIn0KY2F0X3Bsb3QobHVicmlkYXRlOjp5bWQoIjIwMjAtMDQtMjAiKSwgMTAsICJHcsOhZmljbyAxMi4gUGVybWlzbyBkZSBhZHF1aXNpY2nDs24gZGUgYmllbmVzIHkgc2VydmljaW9zIGJhc2ljb3MiLCBwbG90X25ld19jYXNlcywgIk51ZXZvcyBjYXNvcyIpCmBgYApQYXJhIGNvbXByb2JhciBsYSBzaWduaWZpY2FuY2lhIGRlIGVzdGEgZGlmZXJlbmNpYSwgc2UgcGxhbnRlYSB1biB0ZXN0LWYuIEFzdW1pZW5kbyBhIGxvcyBwdW50b3MgdWJpY2Fkb3MgYW50ZXMgZGUgbGEgYXBsaWNhY2nDs24gZGUgbGEgbWVkaWRhIGNvbW8gY29udHJvbDoKCiogSG86IE5vIHNlIHB1ZWRlIGVuY29udHJhciBkaWZlcmVuY2lhcyBzaWduaWZpY2F0aXZhcyBlbnRyZSBsYSBmYXNlIGRlIGNvbnRyb2wgeSB0cmFzIGFwbGljYXIgbGEgbWVkaWRhLgoKKiBIYTogRXhpc3RlbiBkaWZlcmVuY2lhcyBzaWduaWZpY2F0aXZhcyBlbnRyZSBhbnRlcyBkZSBkZWNsYXJhcnNlIGxhIG1lZGlkYSB5IHRyYXMgc3UgZWplY3VjacOzbi4KCgp8RiAtIFRlc3QgVHdvIC0gU2FtcGxlIGZvciBWYXJpYW5jZXMgfAp8LS0tfC0tLS0tLS0tLS18LS0tLS0tfAp8IHwgMHwgMC42ODQzNCB8CnwtLS18LS0tLS0tLS0tLXwtLS0tLS18CnxNZWFuICB8MC4xNjIyMTV8IDAuODY1ODc1fAp8VmFyaWFuY2UgIHwwLjA3OTczOXwgMC4wNzYzMDd8CnxPYnNlcnZhdGlvbnMgfDl8IDl8CnxkZiAgfDh8IDh8CnxGICB8MS4wNDQ5Njd8IHwKfFAgKEYgPD0gZikgb25lLXRhaWwgIHwwLjQ3NTk2MXwKfEYgY3LDrXRpY28gb25lLXRhaWwgIHwzLjQzODEwMXwgfAp8LS0tfC0tLS0tLS0tLS18LS0tLS0tfAoKCkRhZG8gRiA8IEYtY3LDrXRpY28gdW5hIGNvbGEsIG5vIHNlIGVuY3VlbnRyYSBldmlkZW5jaWEgZW4gY29udHJhIGRlIGxhIGhpcMOzdGVzaXMgbnVsYS4gQ29tbyBQKEY8PWYpPjAuMDUsIG5vIHNlIHJlY2hhemEgSG8sIGFzdW1pZW5kbyBwb3IgdGFudG8gcXVlIG5vIGV4aXN0ZW4gZGlmZXJlbmNpYXMgc2lnbmlmaWNhdGl2YXMgZW4gZWwgcmF0aW8gZGUgYXBhcmljacOzbiBkZSBudWV2b3MgY2Fzb3MuCgpgYGB7cixlY2hvPUZBTFNFLG1lc3NhZ2U9RkFMU0UscmVzdWx0cz0iYXNpcyJ9CmNhdF9wbG90KGx1YnJpZGF0ZTo6eW1kKCIyMDIwLTA0LTIwIiksIDEwLCAiR3LDoWZpY28gMTMuIFBlcm1pc28gZGUgYWRxdWlzaWNpw7NuIGRlIGJpZW5lcyB5IHNlcnZpY2lvcyBiYXNpY29zIiwgcGxvdF9ybW92ZXMsICJNb3ZpbGl6YWNpw7NuIHJlY3JlYWNpb25hbCIpCmBgYApFbiBlc3RhIGdyw6FmaWNhIHBvZGVtb3MgdmVyIHF1ZSBsYSBtZWRpZGEgZGUgcGVybWlzbyBkZSBhZHF1aXNpY2nDs24gZGUgYmllbmVzIHkgc2VydmljaW9zIGLDoXNpY29zIG5vIGFmZWN0w7MgZGUgbWFuZXJhIGV2aWRlbnRlIGxhIG1vdmlsaXphY2nDs24gc29jaWFsLCB5YSBxdWUgbm8gc2UgcHVlZGUgdmVyIHVuYSByZWR1Y2Npw7NuIG8gaW5jcmVtZW50byB0b3RhbG1lbnRlIGNsYXJvIGVuIGxvcyBkw61hcyBwb3N0ZXJpb3JlcyBhIGxhIGltcGxlbWVudGFjacOzbiBkZSBlc3RhIG1lZGlkYS4gU2UgcHVlZGUgb2JzZXJ2YXIgZXN0byBtZWRpYW50ZSB1biB0LXRlc3QuIEFzdW1pZW5kbyBhc8OtOgoKKiBIbyA9IE5vIGV4aXN0ZSBkaWZlcmVuY2lhIGFudGVzIHkgZGVzcHXDqXMgZGUgYXBsaWNhcnNlIGxhIG1lZGlkYQoKKiBIYSA9IEV4aXN0ZW4gZGlmZXJlbmNpYXMgc2lnbmlmaWNhdGl2YXMgZW4gbGEgbW92aWxpemFjacOzbiBlbnRyZSBlbCBwZXJpb2RvIHByZXZpbyBhIGxhIGRlY2xhcmFjacOzbiAgeSBlbCBwb3N0ZXJpb3IuCgoKfHQgLSBUZXN0OiBQYWlyZWQgVHdvIFNhbXBsZSBmb3IgTWVhbnMgfAp8LS0tfC0tLS0tLS0tLS18LS0tLS0tfAp8IHwgLTY5fCAtOTMgfAp8LS0tfC0tLS0tLS0tLS18LS0tLS0tfAp8TWVhbiAgfC03Ni43MzgxfCAtNzguOTU1NnwKfFZhcmlhbmNlICB8NDQuMTgzNjd8IDU4LjIxNzc4fAp8T2JzZXJ2YXRpb25zIHw5fCA5fAp8UG9vbGVkICB8NTEuMjAwNzN8IHwKfEh5cG90aGVzaXplZCBNZWFuIERpZmZlcmVuY2UgIHw4fCB8CnxkZiB8OHwgfAp8dCBTdGF0ICB8LTEuNzE0M3wgfAp8UChUIDw9IHQpIG9uZSAtIHRhaWwgIHwwLjA1Mjg4OHwgfAp8dCBDcml0aWNhbCBvbmUgLSB0YWlsIHwxLjc0NTg4NHwgfAp8UChUIDw9IHQpIHR3byAtIHRhaWwgIHwwLjEwNTc3NXwgfAp8dCBDcml0aWNhbCB0d28gLSB0YWlsICB8Mi4xMTk5MDV8IHwKfC0tLXwtLS0tLS0tLS0tfC0tLS0tLXwKCgpEYWRvIHF1ZSB8dHwgPCB0LWNyw610aWNvLCBubyBzZSBwdWVkZSBzb2x2ZW50YXIgbGEgaWRlYSBkZSByZWNoYXphciBsYSBoaXDDs3Rlc2lzIGRpcmVjdGFtZW50ZS4gRGFkbyBhZGVtw6FzIHF1ZSAgUChUPHQpID4gzrEgLCBubyBzZSBsbGVnYSBhIHJlY2hhemFyIGNvbXBsZXRhbWVudGUgSG8sIHBvciBsbyBxdWUgc2UgYXN1bWUgcXVlIG5vIGV4aXN0ZW4gZGlmZXJlbmNpYXMgc2lnbmlmaWNhdGl2YXMuCgojIyDCv0N1w6FsZXMgZXJhbiBsYXMgcmF6b25lcyBwb3IgbGFzIHF1ZSBsYSBwb2JsYWNpw7NuIHNhbMOtYSBkdXJhbnRlIGxhIGN1YXJlbnRlbmE/CgojIyMgUmF6b25lcwpgYGB7cn0KCmRmX2Zvcm0yJHJhem9uZXMgJT4lIHVubGlzdCgpICU+JSB0YWJsZSgpIC0+IHJhem9uZXNfdAp3b3JkY2xvdWQobmFtZXMocmF6b25lc190KSwgYXMudmVjdG9yKHJhem9uZXNfdCksIG1pbi5mcmVxID0gMikKCnRpdGxlKCJHcsOhZmljbyAxNC4gUmF6b25lcyBwYXJhIHNhbGlyIGR1cmFudGUgbGEgY3VhcmVudGVuYSIpCmBgYAoKRWwgZ3LDoWZpY28gYW50ZXJpb3IgbWFuaWZpZXN0YSBhbGd1bmFzIGRlIGxhcyByYXpvbmVzIHF1ZSBqdXN0aWZpY2FuIGxhcyBzYWxpZGFzIGRlIGNhc2EgZGUgbGEgcG9ibGFjacOzbiBlbmN1ZXN0YWRhIGR1cmFudGUgbGEgY3VhcmVudGVuYS4gRXMgbmVjZXNhcmlvIGRlc3RhY2FyIHF1ZSBlc3RhIGdyw6FmaWNhIHNlIHJlbGFjaW9uYSBtdWNobyBjb24gbGEgZ3LDoWZpY2EgNiw4LDEwIHkgMTIsIGRhZG8gcXVlIGV4cGxpY2Fyw61hIGRlIGFsZ8O6biB1IG90cm8gbW9kbyBlbCBhdW1lbnRvIGRlIGNhc29zLiBMYSByYXrDs24gY29uIG1heW9yIHBvcmNlbnRhamUgZXMgbGEgY29taWRhLCBsYSBxdWUgbGUgY29udGluw7phIHNvbiBsb3MgbWVkaWNhbWVudG9zIHkgcG9yIMO6bHRpbW8gZWwgdHJhYmFqby4KCiMjIyBGcmVjdWVuY2lhIGRlIHNhbGlkYQpgYGB7cn0KZGZfZm9ybTIgJT4lCiAgICBncm91cF9ieShzYWxpZGFzKSAlPiUKICAgIHN1bW1hcmlzZShuPW4oKSkgJT4lCiAgICBiYXJwbG90KG5+c2FsaWRhcywgZGF0YT0uLCB5bGFiID0gIlBlcnNvbmFzIiwgeGxhYj0iU2FsaWRhcyIpCgp0aXRsZSgiR3LDoWZpY28gMTUuIFNhbGlkYXMgcG9yIHNlbWFuYSIpCmBgYAoKRXN0ZSBncsOhZmljbyBzZSByZWxhY2lvbmEgbXVjaG8gY29uIGVsIGFudGVyaW9yLCBkYWRvIHF1ZSBleGhpYmUgbGFzIHNhbGlkYXMgcG9yIHNlbWFuYSBkZSBsYSBwb2JsYWNpw7NuIG11ZXN0cmEuIExhIGdyw6FmaWNhIGNvbnRpZW5lIHVuIHB1bnRvIG3DoXhpbW8gZW4gMiwgYWRlbcOhcyBkZSBvdHJvIG3DoXhpbW8gbG9jYWwgZW4gNS4gTGEgbWVkaWEgeSBsYSBtZWRpYW5hIHNvbiAzLjA2IHkgMyByZXNwZWN0aXZhbWVudGUsIGxvIHF1ZSBwcm92ZWUgdW4gYnVlbiBlc3RpbWFkb3IgZGUgbGFzIHNhbGlkYXMgcHJvbWVkaW8gZGUgbGFzIHBlcnNvbmFzIGVuY3Vlc3RhZGFzLgoKIyMgRnJlY3VlbmNpYSBkZSBzYWxpZGEgVlMgSW5ncmVzb3MKYGBge3J9CgpnZ3Bsb3QoYWVzKHggPXNhbGlkYXNfLCB5ID0gaW5ncmVzbywgZ3JvdXA9aW5ncmVzbyksIGRhdGEgPSBkZl9mb3JtMikgKwogICAgZ2VvbV9ib3hwbG90KCkgKwogICAgZ2d0aXRsZSgiU2FsaWRhcyB2cyBpbmdyZXNvcyIpICsKICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQoKYGBgCgpQYXJhIGVsIHJhbmdvIG3DoXMgYmFqbyBkZSBpbmdyZXNvcyBbMC0xMDAwXSBzb2xlcywgZGUgYWN1ZXJkbyBhIGxhIGNhamEgZGUgYmlnb3Rlcywgc2Ugb2J0dXZvIHVuYSBtZWRpYW5hIGRlIDIgZW4gbGEgZnJlY3VlbmNpYSBkZSBzYWxpZGEuIEVzdG8gZXZpZGVuY2lhIHF1ZSBjYXNpIGVsIDUwJSBpbmNpZGUgZW4gc2FsaXIgbWVub3MgZGUgMiB2ZWNlcyB5IGVsIG90cm8gNTAlIHNhbGUgbcOhcyBkZSAyIHZlY2VzLiBQYXJhIGVsIHJhbmdvIG3DoXMgYWx0byBkZSBpbmdyZXNvcyBbPjEwMDAwXSBsYSBtZWRpYW5hIGVzIDMuIEVsbG8gcmVwcmVzZW50YSBxdWUgZWwgNTAlIGluY2lkZSBlbiBzYWxpciBtw6FzIGRlIDMgdmVjZXMuICBMb3MgaW5ncmVzb3MgZW50cmUgYW1ib3MgcmFuZ29zIG11ZXN0cmFuIHVuYSBmcmVjdWVuY2lhICBkZSBzYWxpZGEgbWVub3IsIGxhIGN1YWwgZmF2b3JlY2UgZW4gbWVkaWFuYSBhIHNhbGlkYXMgbWVub3JlcyBxdWUgMyB5IDIuIEEgbWVkaWRhIHF1ZSBpbmNyZW1lbnRhbiBsb3MgaW5ncmVzb3Mgbm8gc2UgZXZpZGVuY2lhIHVuIGNvbXBvcnRhbWllbnRvIGRlZmluaWRvIHBhcmEgbGFzIGZyZWN1ZW5jaWFzIGRlIHNhbGlkYSwgcGVybyBzaSB1biBmYXZvcmVjaW1pZW50byBhIG1lbm9yZXMgc2FsaWRhcyBxdWUgZWwgcmFuZ28gbcOhcyBiYWpvIGRlIGluZ3Jlc29zLiBMYSDDum5pY2EgZXhjZXBjacOzbiBzZSBkYSBwYXJhIGVsIHJhbmdvIG3DoXMgYWx0byBkZSBpbmdyZXNvcy4KCmBgYHtyfQpnZ3Bsb3QoYWVzKHg9c2FsaWRhc18sIHk9aW5ncmVzbywgZ3JvdXA9c2FsaWRhc18pLCBkYXRhID0gZGZfZm9ybTIpICtnZW9tX2NvdW50KCkKYGBgCkVzdGEgc2VndW5kYSBncsOhZmljYSBtdWVzdHJhIGxhIGNhbnRpZGFkIGRlIG9ic2VydmFjaW9uZXMgcG9yIGluZ3Jlc28geSBmcmVjdWVuY2lhIGRlIHNhbGlkYS4gU2Ugb2JzZXJ2YSBxdWUgcGFyYSAwIHNhbGlkYXMgLCBhIG1lZGlkYSBxdWUgYXVtZW50YW4gbG9zIGluZ3Jlc29zIG1lbm9zIHBlcnNvbmFzIGluY2lkZW4gZW4gZXN0YS4gRWwgbWlzbW8gY29tcG9ydGFtaWVudG8gc2UgZGEgcGFyYSAxIHNhbGlkYSwgNSBzYWxpZGFzLiBFcyBzaW1pbGFyIGVsIGNvbXBvcnRhbWllbnRvIHBhcmEgMiwzLDYgc2FsaWRhcyBzb2xvIHF1ZSBleGlzdGVuIHZhcmlhY2lvbmVzIG3DoXMgbm90b3JpYXMuIEFzaW1pc21vLCBzZSBtdWVzdHJhIHF1ZSBsb3MgcmFuZ29zIG3DoXMgYmFqb3MgZGUgaW5ncmVzb3MgWzAsMTAwMF0sWzEwMDAsMjAwMCkgcHJlc2VudGFuIG1heW9yIGNhbnRpZGFkIGRlIG9ic2VydmFjaW9uZXMgZGUgMCBhIDYgc2FsaWRhcy4KCiNGcmVjdWVuY2lhIGRlIHNhbGlkYSB2cy4gRWRhZApgYGB7cn0KZ2dwbG90KGFlcyh4ID0gc2FsaWRhc18sIHkgPSBlZGFkLCBncm91cCA9IHNhbGlkYXNfKSwgZGF0YSA9IGRmX2Zvcm0yKSArIGdlb21fYm94cGxvdCgpICsgIGdndGl0bGUoIlNhbGlkYXMgdnMgZWRhZCIpICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpCgpgYGAKCkVzdGEgZ3LDoWZpY2EgbXVlc3RyYSBxdWUgbGFzIG1lZGlhbmFzIGRlIGxhcyBlZGFkZXMgY2FtYmlhbiBsaWdlcmFtZW50ZSBjb24gbGEgZnJlY3VlbmNpYSBkZSBzYWxpZGEuIFBhcmEgMCBzYWxpZGFzIGhheSBwZXJzb25hcyAxOC0zMiBhw7FvcyBxdWUgYWJhcmNhbiAyNSUgeSA3NSUgZGVsIHRvdGFsLiBQYXJhIDEgc2FsaWRhIGV4aXN0ZW4gcGVyc29uYXMgY29uIG3DoXMgZWRhZCAgZGUgMjUtIDQ1IGHDsW9zIHF1ZSBvY3VwYW4gZWwgcmFuZ28gaW50ZXJjdWFydMOtbGljby4gUGFyYSAyLDMgc2FsaWRhcyBzZSBtYW50aWVuZSBlc2UgcmFuZ28gZGUgZWRhZGVzIHkgbGEgbWVkaWFuYSBjYW1iaWEgY2FzaSBuYWRhLiBQYXJhIDUsNiBzYWxpZGFzIGxhIG1lZGlhbmEgbm8gYXVtZW50YSBuaSBkaXNtaW51eWUgc2lnbmlmaWNhdGl2YW1lbnRlLiBVbiBhdW1lbnRvIGRlIGxhIG1lZGlhbmEgYSBtZWRpZGEgcXVlIGF1bWVudGEgbGEgZnJlY3VlbmNpYSBkZSBzYWxpZGEgaW1wbGljYXJpYSBxdWUgZW4gY2FkYSBmcmVjdWVuY2lhIGRlIHNhbGlkYSBjYXNpIGVsIDUwJSBsbyBvY3VwZW4gcGVyc29uYXMgZGUgbcOhcyBlZGFkIHF1ZSBsYSBhbnRlcmlvciBmcmVjdWVuY2lhIGRlIHNhbGlkYS4gRGFkbyBxdWUgbm8gc3VjZWRlIGVzdG8sIHNlIGV2aWRlbmNpYW4gIGRpc3RyaWJ1Y2lvbmVzIGFsZ28gc2ltaWxhcmVzLgoKYGBge3J9CmdncGxvdChhZXMoeSA9IHNhbGlkYXNfLCB4ID0gZ2VuZXJvLCBncm91cCA9IGdlbmVybyksIGRhdGEgPSBkZl9mb3JtMiApICsgZ2VvbV9jb3VudCgpICsgIGdndGl0bGUoIkfDqW5lcm8gdnMgc2FsaWRhcyIpICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpCgpgYGAKTGEgZ3LDoWZpY2EgbXVlc3RyYSBxdWUgbGFzIG9ic2VydmFjaW9uZXMgc29uIG1heW9yZXMgcGFyYSBlbCBnw6luZXJvIG1hc2N1bGluby4gTG9zIGhvbWJyZXMsIGVudHJlIDEtMyBzYWxpZGFzIGluY2lkZW4gbcOhcywgbGFzIG11amVyZXMgZGUgaWd1YWwgZm9ybWEgaW5jaWRlbiBtw6FzIGVuIDEtMyBzYWxpZGFzLiBQYXJhIGxhcyBtdWplcmVzLCBsYSBjYW50aWRhZCBkZSBvYnNlcnZhY2lvbmVzIGluY3JlbWVudGEgZGUgMC0xIHNhbGlkYSwgZW50cmUgMS0zIHNhbGlkYXMgbGEgY2FudGlkYWQgZGUgb2JzZXJ2YWNpb25lcyBlcyBsYSBtaXNtYSAsIGx1ZWdvIGEgbWVkaWRhIHF1ZSBpbmNyZW1lbnRhbiBsYXMgc2FsaWRhcyBsYSBjYW50aWRhZCBkZSBvYnNlcnZhY2lvbmVzIGRpc21pbnV5ZS4gUGFyYSBsb3MgaG9tYnJlcywgbGEgY2FudGlkYWQgZGUgb2JzZXJ2YWNpb25lcyBpbmNyZW1lbnRhIGVudHJlIDAtMiBzYWxpZGFzLCBsdWVnbyBhIG1lZGlkYSBxdWUgYXVtZW50YW4gbGFzIHNhbGlkYXMsIGxhIGNhbnRpZGFkIGRpc21pbnV5ZSB5IHZ1ZWx2ZSBhIGF1bWVudGFyLiBFeGlzdGUgbWF5b3IgZGlzcGVyc2nDs24gcGFyYSBtw6FzIGRlIDMgc2FsaWRhcy4KCmBgYHtyfQpnZ3Bsb3QoYWVzKHkgPSBzYWxpZGFzXywgeCA9IGVtcGxlbywgZ3JvdXAgPSBlbXBsZW8pLCBkYXRhID0gZGZfZm9ybTIgKSArIGdlb21fY291bnQoKSArICBnZ3RpdGxlKCJUaXBvX3RyYWJham8gdnMgc2FsaWRhcyIpICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpCmBgYAoKTGEgY2FudGlkYWQgZGUgb2JzZXJ2YWNpb25lcyBlcyBtYXlvciBwYXJhIGxhcyBwZXJzb25hcyBjb24gdW4gdHJhYmFqbyBmb3JtYWwuIEVzdGFzIHRpZW5lbiBtYXlvciB2YXJpYWNpw7NuIGVuIGxhIGNhbnRpZGFkIGRlIG9ic2VydmFjaW9uZXMgYSBtZWRpZGEgcXVlIGF1bWVudGFuIGxhcyBzYWxpZGFzLiBQYXJhIGxhcyBwZXJzb25hcyBjb24gdW4gdHJhYmFqbyBpbmZvcm1hbCwgZXhpc3RlIHVuYSBtZW5vciB2YXJpYWNpw7NuIGVuIGxhIGNhbnRpZGFkIGRlIG9ic2VydmFjaW9uZXMuCgoKCiMjIMK/Q3XDoWxlcyBoYW4gc2lkbyBsYXMgbWVkaWRhcyBxdWUgaGFuIHRlbmlkbyBtYXlvciBpbXBhY3RvIGVuIGxhIHBvYmxhY2nDs24/CgojIyBNZWRpZGFzCmBgYHtyfQpwYXIobWFpID0gYygxLCAyLjUsIDAuNSwgMC41KSkKCih0YWJsZShjKAogICAgcmVwKCJJbm1vdmlsaXphY2nDs24iLCAgICAgICAgICAgICAgIGxlbmd0aCh3aGljaChkZl9mb3JtMiRzb2NpYWwuYm9vbCkpKSwKICAgIHJlcCgiTm8gYWNjZXNvIGEgbHVnYXJlcyBww7pibGljb3MiLCBsZW5ndGgod2hpY2goZGZfZm9ybTIkb2Npby5ib29sKSkpLAogICAgcmVwKCJTYWxpZGEgaW50ZXJjYWxhZGEiLCAgICAgICAgICAgbGVuZ3RoKHdoaWNoKGRmX2Zvcm0yJG5vZGF5LmJvb2wpKSksCiAgICByZXAoIkJvbm8iLCAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgod2hpY2goZGZfZm9ybTIkYm9uby5ib29sKSkpLAogICAgcmVwKCJVbiBtb250byBkZWwgQWZwIiwgICAgICAgICAgICAgbGVuZ3RoKHdoaWNoKGRmX2Zvcm0yJGFmcDEuYm9vbCkpKSwKICAgIHJlcCgiVW4gcG9yY2VudGFqZSBkZWwgQWZwIiwgICAgICAgIGxlbmd0aCh3aGljaChkZl9mb3JtMiRhZnAyLmJvb2wpKSkKKSkvbGVuZ3RoKGRmX2Zvcm0yJHNvY2lhbC5ib29sKSkgJT4lCiAgICBzb3J0KFRSVUUpICU+JQogICAgYmFycGxvdChob3JpeiA9IFRSVUUsCiAgICAgICAgICAgIGxhcyA9IDEsCiAgICAgICAgICAgIHlsYWIgPSAiIiwKICAgICAgICAgICAgeGxhYiA9ICJBcHJvYmFjacOzbiIKICAgICkKdGl0bGUoIkdyw6FmaWNvIDE2LiBBcHJvYmFjacOzbiBwb3IgbWVkaWRhIChkZSAwIGEgMSkiKQpgYGAKCkVsIGdyw6FmaWNvIDE2IG11ZXN0cmEgZWwgbml2ZWwgZGUgYXByb2JhY2nDs24gZGUgbGFzIG1lZGlkYXMgcXVlIHNlIGVzdMOhbiBlc3R1ZGlhbmRvLiBObyBvYnN0YW50ZSwgdGFtYmnDqW4gc2UgaGFuIGluY2x1aWRvIGRlbnRybyBkZWwgcGFkcsOzbiBkZSBob2dhcmVzIGVsIG1vbnRvIGRlIEFGUCB5IHVuIHBvcmNlbnRhamUgZGVsIG1pc21vLiBDb24gdW4gbml2ZWwgZGUgYXByb2JhY2nDs24gbWF5b3IgYSAwLjgsIGxhIHBvYmxhY2nDs24gb3B0w7MgcG9yIGxhIG1lZGlkYSDigJxEZWNsYXJhY2nDs24gZGUgRXN0YWRvIGRlIEVtZXJnZW5jaWHigJ0uIERlc2RlIGVsIHB1bnRvIGRlIHZpc3RhIGRlIGxhIHBvYmxhY2nDs24gbGEgaW5tb3ZpbGl6YWNpw7NuIGNvbnRyaWJ1ecOzIGVuIG1heW9yIG1lZGlkYS4gRWwgc2VndW5kbyBsdWdhciBlcyBwYXJhIGVsIG5vIGFjY2VzbyBhIGx1Z2FyZXMgcMO6YmxpY29zLCBlcyBkZWNpciBlbCBwZXJtaXNvIHBhcmEgbGEgYWRxdWlzaWNpw7NuIGRlIGJpZW5lcyB5IHNlcnZpY2lvcyBiw6FzaWNvcy4gTHVlZ28sIGNvbiB1bmEgYXByb2JhY2nDs24gbWVub3IgYSAwLjYgbGFzIHNhbGlkYXMgcG9yIGfDqW5lcm8uIEZpbmFsbWVudGUsIGxhIGFwcm9iYWNpw7NuIGRlbCBQYWRyw7NuIGRlIEhvZ2FyZXMgY29uIHVuYSBhcHJvYmFjacOzbiBkZSAwLjIgYXByb3hpbWFkYW1lbnRlLgoKIyBSZXNwb25kaWVuZG8gbGFzIHByZWd1bnRhcyBleHBsb3JhdG9yaWFzCgojIyDCv0V4aXN0ZSB1bmEgbWlzbWEgdGVuZGVuY2lhIGRlIHBvYmxhY2lvbmVzIGFmZWN0YWRhcyBwb3IgZWwgQ292aWQgMTkgZHVyYW50ZSBsYXMgbWVkaWRhcyBkZSBhaXNsYW1pZW50bz8KCkVsIGdyw6FmaWNvIDE3IG11ZXN0cmEgbGEgcmVsYWNpw7NuIGVudHJlIGxhcyB2YXJpYWJsZXMgY2xhc2Ugc29jaWFsIHkgZGlzdHJpdG8uIFVuYSBwYXJ0ZSBkZSBsYSBwb2JsYWNpw7NuIHNlIGRpc3RyaWJ1ecOzIGVudHJlIGxvcyBkaXN0cml0b3MgQmFycmFuY28gY29uIDMwMDAgYSA0MDAwIHNvbGVzIGRlIGluZ3Jlc29zIG1lbnN1YWxlcywgU2FudGlhZ28gZGUgU3VyY28gWzYwMDAtNzAwMCksIFN1cnF1aWxsbyBbNzAwMC04MDAwKSB5IFZpbGxhIE1hcsOtYSBkZWwgVHJpdW5mbyBbNTAwMC02MDAwKS4gTm8gb2JzdGFudGUsIGxhIG1heW9yIHBhcnRlIGRlIGxhIHBvYmxhY2nDs24gc2UgdWJpY2EgZW4gdW4gbml2ZWwgZGUgaW5ncmVzbyBlbnRyZSAwIGEgMjAwMC4gRW4gZWwgZ3LDoWZpY28gMTggc2UgbXVlc3RyYSBlbCBuw7ptZXJvIGRlIGNhc29zIHBvciBkaXN0cml0by4gRXN0b3MgcmVzdWx0YWRvcyBzZSBwdWVkZW4gdmluY3VsYXIgZGlyZWN0YW1lbnRlIGNvbiBsb3MgaW5ncmVzb3MgZGUgbGEgcG9ibGFjacOzbi4gRW4gZWwgZ3LDoWZpY28gMTcgYW5hbGl6YW1vcyBsb3MgZGlzdHJpdG9zIHF1ZSB0aWVuZW4gdW5hIG1heW9yIGRpc3RyaWJ1Y2nDs24gZW4gdW4gaW5ncmVzbyBlc3BlY8OtZmljby4gUG9yIGVqZW1wbG8sIGVuIGVsIGdyw6FmaWNvIDE4LiBlbCBkaXN0cml0byBkZSBCYXJyYW5jbyB0aWVuZSB1biBuw7ptZXJvIGRlIGNhc29zIG1lbm9yIGEgMjAwMCBtaWwgY2Fzb3MuIFN1cnF1aWxsbyBwb3Igc3UgcGFydGUgdGllbmUgYXByb3hpbWFkYW1lbnRlIDIxMDAgY2Fzb3MuIE3DoXMgYcO6biwgU2FudGlhZ28gZGUgU3VyY28gNTAwMCBjYXNvcyB5IFZpbGxhIE1hcsOtYSBkZWwgVHJpdW5mbyA1ODAwIGNhc29zLiBBIHBhcnRpciBkZSBlbGxvIHBvZHLDrWFtb3MgZXN0YWJsZWNlciBjaWVydG9zIHBhdHJvbmVzLiBFbCBwcmltZXJvIGRlIGVsbG9zIHNlcsOtYSBxdWUgcGFyYSBsYXMgcG9ibGFjaW9uZXMgZGUgdW4gZXN0YXR1cyBzb2NpYWwgc29sdmVudGUgKGluZ3Jlc29zIG1heW9yZXMgYSA0MDAwKSB5IHF1ZSBlc3RlIHNlYSBkZSB1biBkZXRlcm1pbmFkbyBkaXN0cml0byBwcmVzZW50YXLDoSB1biBtZW5vciBuw7ptZXJvIGRlIGNvbnRhZ2lhZG9zLiBFc3RvIHNlIGN1bXBsZSBwYXJhIEJhcnJhbmNvLCBTdXJxdWlsbG8geSBTYW50aWFnbyBkZSBTdXJjby4gTm8gb2JzdGFudGUsIHNpIG5vcyBkaXJpZ2ltb3MgYSBhbmFsaXphciBkZXRlcm1pbmFkYXMgcG9ibGFjaW9uZXMgZG9uZGUgZWwgbsO6bWVybyBkZSBpbmZlY3RhZG9zIGVzIGVsZXZhZG8geSBub3MgZmlqYW1vcyBlbiBlbCBpbmdyZXNvIHByb21lZGlvIHBvZGVtb3MgZGFyIGN1ZW50YSBxdWUgbGEgbWF5b3IgcGFydGUgb3NjaWxhIGVudHJlIGNlcm8gYSBtaWwgc29sZXMgbWVuc3VhbGVzLiBCYXN0YSBwYXJhIGlsdXN0cmFyLCBDb21hcywgZGlzdHJpdG8gcXVlIHRpZW5lIHVuIGluZ3Jlc28gZGUgY2VybyBhIG1pbCB5IGN1eW8gbsO6bWVybyBkZSBjYXNvcyBhc2NpZW5kZSBhIGNhc2kgOTAwMC4KCiMjIyBEaXN0cml0byB2cyBpbmdyZXNvCmBgYHtyLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9MjB9CiMgTm8gc3VwZSBjb21vIGhhY2VybG8gY29uIHZhbmlsbGEgUgpnZ3Bsb3QoYWVzKHkgPSBkaXN0cml0bywgeCA9IGluZ3Jlc28pLCBkYXRhID0gZGZfZm9ybTIpICsKICAgIGdlb21fYm94cGxvdCgpICsKICAgIGdndGl0bGUoIkdyw6FmaWNvIDE3LiBEaXN0cml0b3MgdnMgaW5ncmVzb3MiKSArCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkKYGBgCgojIyMgQ2Fzb3MgcG9yIGRpc3RyaXRvCmBgYHtyLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9MjB9CnBhcihtYWkgPSBjKDEsIDIuNSwgMSwgMC41KSkKZGYgJT4lIGZpbHRlcihQUk9WSU5DSUEgPT0gIkxJTUEiKSAlPiUKICAgIHNlbGVjdChESVNUUklUTykgJT4lCiAgICB0YWJsZSgpICU+JQogICAgc29ydChUUlVFKSAlPiUKICAgIGJhcnBsb3QobGFzPTEsIGhvcml6PVRSVUUsIHhsYWI9IkNhc29zIikKdGl0bGUoIkdyw6FmaWNvIDE4LiBDYXNvcyBwb3IgZGlzdHJpdG8iKQpgYGAKCiMjIMK/TGFzIG1lZGlkYXMgZW4gbG9zIGRpc3RyaXRvcyBtw6FzIGV4Y2x1c2l2b3MgcHJlc2VudGFuIHVuYSBtYXlvciBvIG1lbm9yIGVmZWN0aXZpZGFkPwoKTGFzIG1lZGlkYXMgcHJlc2VudGFuIHVuYSBtYXlvciBlZmVjdGl2aWRhZCBlbiBlbCBkaXN0cml0byBkZSBCYXJyYW5jbywgZGFkbyBxdWUgYSBkaWZlcmVuY2lhIGRlIGxvcyBkZW3DoXMsIHN1IG7Dum1lcm8gb3NjaWxhIGVuIGFwcm94aW1hZGFtZW50ZSA5MDAgY2Fzb3MuIEVsIG1heW9yIG7Dum1lcm8gZGUgY2Fzb3MgZXMgZW4gU2FudGlhZ28gZGUgU3VyY28sIGNvbiBtw6FzIGRlIDQwMDAgbWlsIGNhc29zLiBBbmFsaXphbmRvLCBsYSBncsOhZmljYSAyMCwgbGEgY3VhbCByZWxhY2lvbmEgZW1wbGVvIFZTLiBEaXN0cml0byBzZSBwdWVkZSBjb25zdGF0YXIgcXVlIGVuIEJhcnJhbmNvIGV4aXN0ZSBtYXlvciBjYW50aWRhZCBkZSBnZW50ZSBjb24gdW4gZW1wbGVvIGluZm9ybWFsLiBDYWJlIHNlw7FhbGFyIHF1ZSB0YW1iacOpbiBoYXkgcG9ibGFjacOzbiBxdWUgbm8gdHJhYmFqYS4gUG9yIG90cm8gbGFkbywgZW4gU2FudGlhZ28gZGUgU3VyY28sIFNhbiBJc2lkcm8geSBTYW4gQm9yamEgZXhpc3RlIHVuYSBlbXBsZWFiaWxpZGFkIGZvcm1hbC4gVW4gcGF0csOzbiBtdXkgaW50ZXJlc2FudGUgZXMgcXVlIGxvcyBkaXN0cml0b3MgcXVlIHByZXNlbnRhbiB1bmEgZW1wbGVhYmlsaWRhZCBmb3JtYWwgdGllbmUgdW5hIG1heW9yIGNhbnRpZGFkIGRlIGluZ3Jlc29zLiBCYXN0YSBwYXJhIGlsdXN0cmFyLCBCYXJyYW5jbyB0aWVuZSB1biBpbmdyZXNvIGRlIGFscmVkZWRvciBkZSA0MDAwIHNvbGVzIGNvbiB1bmEgZW1wbGVhYmlsaWRhZCBpbmZvcm1hbCwgbWllbnRyYXMgcXVlIGxvcyB0cmVzIHJlc3RhbnRlcyB0aWVuZW4gdW4gaW5ncmVzbyBtYXlvciBhIDgwMDAgc29sZXMgY29uIHVuIHRpcG8gZGUgZW1wbGVvIGZvcm1hbC4KCiMjIyBEaXN0cml0byBleGNsdXNpdm9zIHZzIGNhc29zCmBgYHtyfQpwYXIobWFpID0gYygxLCAyLCAwLjIsIDAuNSkpCmRmICU+JSBmaWx0ZXIoUFJPVklOQ0lBID09ICJMSU1BIikgJT4lCiAgICBmaWx0ZXIoRElTVFJJVE8gJWluJSBjKCJNSVJBRkxPUkVTIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJBUlJBTkNPIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNBTiBJU0lEUk8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiU0FOVElBR08gREUgU1VSQ08iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiU0FOIEJPUkpBIikKICAgICAgICAgICApIC0+IGluZmVjdGFkb3NfNSAjIEVzIG5lY2VzYXJpbyBsdWVnbwoKaW5mZWN0YWRvc181ICU+JQogICAgc2VsZWN0KERJU1RSSVRPKSAlPiUKICAgIHRhYmxlKCkgJT4lCiAgICBzb3J0KFRSVUUpICU+JQogICAgYmFycGxvdChsYXM9MSwgaG9yaXo9VFJVRSwgeGxhYj0iQ2Fzb3MiKQp0aXRsZSgiR3LDoWZpY28gMTkuIENhc29zIGVuIGFsZ3Vub3MgZGlzdHJpdG9zIikKYGBgCgojIyMgRGlzdHJpdG8gZXhjbHVzaXZvcyB2cyBlbXBsZW8KYGBge3J9CmRmX2Zvcm0yICU+JQogICAgZmlsdGVyKGRpc3RyaXRvICVpbiUgYygiTWlyYWZsb3JlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJCYXJyYW5jbyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJTYW4gSXNpZHJvIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNhbnRpYWdvIGRlIFN1cmNvIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNhbiBCb3JqYSIpCiAgICAgICAgICAgKSAtPiBkZl81CmdncGxvdChhZXMoeSA9IGRpc3RyaXRvLCB4ID0gZW1wbGVvKSwgZGF0YSA9IGRmXzUpICsKICAgIGdlb21fYm94cGxvdCgpICsKICAgIGdndGl0bGUoIkdyw6FmaWNvIDIwLiBkaXN0cml0b3MgdnMgdGlwbyBkZSBlbXBsZW8iKQpgYGAKCiMjIyBEaXN0cml0byBleGNsdXNpdm8gdnMgaW5ncmVzbwpgYGB7cn0KZ2dwbG90KGFlcyh5ID0gZGlzdHJpdG8sIHggPSBpbmdyZXNvKSwgZGF0YSA9IGRmXzUpICsKICAgIGdlb21fYm94cGxvdCgpICsKICAgIGdndGl0bGUoIkdyw6FmaWNvIDIxLiBkaXN0cml0b3MgdnMgaW5ncmVzb3MiKSAjIEHDum4gbm8gaGEgcmVzcG9uZGlkbyBuYWRpZSBkZSBNaXJhZmxvcmVzLgpgYGAKCiMgUmVzcG9uZGllbmRvIGxhcyBwcmVndW50YXMgaW5mZXJlbmNpYWxlcwoKIyMgwr9MYSBlbnRyZWdhIGRlIG1heW9yZXMgc3Vic2lkaW9zIG1vbmV0YXJpb3MgcmVzdWx0YXLDrWEgZW4gdW4gaW1wb3J0YW50ZSBiZW5lZmljaW8gcGFyYSBsYSBkaXNtaW51Y2nDs24gZGVsIG7Dum1lcm8gZGUgc2FsaWRhcz8KCkEgcGFydGlyIGRlbCBncsOhZmljbyAyMiBzZSBtYW5pZmllc3RhIHF1ZSBlc3RhIG1lZGlkYSwgcGFyYSBsYSBwb2JsYWNpw7NuIGVuY3Vlc3RhZGEsIG5vIHJlZHVqbyBsYXMgc2FsaWRhcy4gRXN0byByZXNwYWxkYSBsYXMgaGlww7N0ZXNpcyBxdWUgc3VzY2l0YXJvbiBlbiBsYSBncsOhZmljYSA4IHkgOSwgbGFzIGN1YWxlcyBleHBvbsOtYW4gcXVlIGF1bnF1ZSBlbCBvYmpldGl2byBkZWwgcGFkcsOzbiBkZSBob2dhcmVzIGVyYSBheXVkYXIgYSBsYXMgcG9ibGFjaW9uZXMgbcOhcyB2dWxuZXJhYmxlcyBwYXJhIHF1ZSBwdWVkYW4gYWNjZWRlciBhIGxvcyBzZXJ2aWNpb3MgYsOhc2ljb3MsIGVsIG1pc21vIGhlY2hvIGRlIGNvYnJhciBoYWPDrWEgcXVlIGxhIHNhbGlkYXMgYXVtZW50ZW4uIERlbCBtaXNtbyBtb2RvLCBsYSBhZ2xvbWVyYWNpw7NuIHJlc3VsdGFyw61hIGVuIHVuIGF1bWVudG8gZGVsIG7Dum1lcm8gZGUgY29udGFnaWFkb3MsIGVsIGN1YWwgc2UgbXVlc3RyYSBjbGFyYW1lbnRlIGVuIGxhIGdyw6FmaWNhIDguCgojIyMgRW50cmVnYSBkZSBib25vIFMvLiAzODAsIFMvLjc2MCBkZSBhY3VlcmRvIGFsIFNpc3RlbWEgZGUgRm9jYWxpemFjacOzbiBkZSBIb2dhcmVzIChTSVNGT0gpCmBgYHtyfQpkZl9mb3JtMiRib25vLjA1ICU+JQogICAgdGFibGUoKSAlPiUKICAgIGJhcnBsb3QoeWxhYj0iUGVyc29uYXMiKQoKdGl0bGUoIkdyw6FmaWNvIDIyLiBSZWR1Y2Npw7NuIGRlIHNhbGlkYXMgKDAgLSA1KSIpCmBgYAoKIyMgRGlzbWludWNpw7NuIGRlIHNhbGlkYXMgZGUgbGFzIGRlbcOhcyBtZWRpZGFzCgojIyMgSW5tb3ZpbGl6YWNpw7NuCmBgYHtyfQpkZl9mb3JtMiRzb2NpYWwuMDUgJT4lCiAgICB0YWJsZSgpICU+JQogICAgYmFycGxvdCh5bGFiPSJQZXJzb25hcyIpCgp0aXRsZSgiRGUgMCBhIDUsIMK/Q8O6YW50byBkaXNtaW51eWVyb24gdHVzIHNhbGlkYXMgZHVyYW50ZSBsYSBjdWFyZW50ZW5hPyIpCmBgYAoKIyMjIFN1c3BlbnNpw7NuIGRlIGFjY2VzbyBhIGx1Z2FyZXMgcMO6YmxpY29zCmBgYHtyfQpkZl9mb3JtMiRvY2lvLjA1ICU+JQogICAgdGFibGUoKSAlPiUKICAgIGJhcnBsb3QoeWxhYj0iUGVyc29uYXMiKQoKdGl0bGUoIkRlIDAgYSA1LCDCv0PDumFudG8gZGlzbWludXllcm9uIHR1cyBzYWxpZGFzIGR1cmFudGUgbGEgY3VhcmVudGVuYT8iKQpgYGAKCiMjIyBEaXNwb3NpY2nDs24gc2FsaWRhIGRlIGhvbWJyZXMgeSBtdWplcmVzIGVuIGTDrWFzIGNvbXBsZW1lbnRhcmlvcwpgYGB7cn0KZGZfZm9ybTIkbm9kYXkuMDUgJT4lCiAgICB0YWJsZSgpICU+JQogICAgYmFycGxvdCh5bGFiPSJQZXJzb25hcyIpCgp0aXRsZSgiRGVsIDAgYWwgNSwgwr9DdcOhbnRvIGNhbWJpw7MgdHVzIHNhbGlkYXM/IikKYGBgCgojIFJlc3BvbmRpZW5kbyBsYXMgcHJlZ3VudGFzIHByZWRpY3RpdmFzCgojIyDCv0VzIHBvc2libGUgcHJlZGVjaXIgY3XDoW50YXMgaG9yYXMgZW4gcHJvbWVkaW8gdW5hIHBlcnNvbmEgc2Fsw61hIGRlIGNhc2EgY29ub2NpZW5kbyBzdSBuaXZlbCBkZSBpbmdyZXNvcyB5IGVsIGRpc3RyaXRvIGRlIHJlc2lkZW5jaWE/CgpQYXJhIGVzdGEgcHJlZ3VudGEsIHV0aWxpemFyZW1vcyBsYSBncsOhZmljYSAxNyBwYXJhIHRyYXRhciBkZSBkYXJsZSByZXNwdWVzdGEuIENvbW8geWEgc2UgYW5hbGl6w7MgcHJldmlhbWVudGUsIGVzdGEgZ3LDoWZpY2EgZXhoaWJlIHF1ZSB0cmVzIGRlIGxvcyBjaW5jb3MgZGlzdHJpdG9zIGV4Y2x1c2l2b3MgZGUgTGltYSB0aWVuZW4gdW4gaW5ncmVzbyBlbnRyZSAzMDAwIHkgODAwMCBzb2xlcy4gU2luIGVtYmFyZ28gZW4gZGlzdHJpdG9zIGNvbW8gQXRlIFZpdGFydGUsIENpZW5lZ3VpbGxhLCBFbCBBdWd1c3Rpbm8sIEluZGVwZW5kZW5jaWEsIEx1csOtbiwgZW50cmUgb3Ryb3MsIGVsIG5pdmVsIGRlIGluZ3Jlc29zIGVzIGRlc2RlIDEwMDAgYSAyMDAwIHNvbGVzLiBFbiBiYXNlIGEgZXN0b3MgZGF0b3MsIHBvZHLDrWFtb3MgcHJlZGVjaXIgcXVlIGxhcyBwZXJzb25hcyBjb24gbWF5b3JlcyBpbmdyZXNvcyBzb24gbGFzIHF1ZSBtZW5vcyBob3JhcyBzYWxlbiBkZSBjYXNhLCBtaWVudHJhcyBxdWUgbGFzIHBlcnNvbmFzIHF1ZSBubyB0aWVuZW4gdW5hIGJ1ZW5hIHNvbHZlbmNpYSBlY29uw7NtaWNhIHJlcXVlcmlyw61hbiB5IHNlIHZlcsOtYW4gZW4gbGEgb2JsaWdhY2nDs24gZGUgc2FsaXIgZGUgY2FzYSBwYXJhIHBvZGVyIGNvbnNlZ3VpciBkaW5lcm8sIHlhIHNlYSB2ZW5kaWVuZG8gcHJvZHVjdG9zIGRlIHByaW1lcmEgbmVjZXNpZGFkLCByb3BhLCBhY2Nlc29yaW9zLCBldGMuCgojIyDCv0VzIHBvc2libGUgcHJlZGVjaXIgc3Ugbml2ZWwgZGUgaW5ncmVzb3MgY29ub2NpZW5kbyDDum5pY2FtZW50ZSBzdSB0aXBvIGRlIGVtcGxlbz8KCkRlc3B1w6lzIGRlIHJlYWxpemFyIHVuYSBpbnZlc3RpZ2FjacOzbiwgc2UgcHVkbyBlbmNvbnRyYXIgcXVlIGxhcyBwZXJzb25hcyBjb24gdW4gZW1wbGVvIGluZm9ybWFsIGdhbmFuIGVuIHByb21lZGlvIFMvLiA3MTUuIExhIG1pbmlzdHJhIGRlIFRyYWJham8sIFN5bHZpYSBDw6FjZXJlcyBtZW5jaW9uw7MgcXVlIGVuIGNvbnRyYXN0ZSBjb24gbGEgcG9ibGFjacOzbiBlbiBlbCBzZWN0b3IgZm9ybWFsIHBlcmNpYmVuIHVuIHNhbGFyaW8gcHJvbWVkaW8gZGUgbcOhcyBkZSBTLy4gMjAwMC4gRXMgbmVjZXNhcmlvIGRlc3RhY2FyIHF1ZSBsYSB2YXJpYWJpbGlkYWQgZGVwZW5kZXLDoSBkZWwgdGlwbyBkZSB0cmFiYWpvLiBUYW1iacOpbiBsYSBtaW5pc3RyYSBtZW5jaW9uw7MgcXVlIGxhIGJyZWNoYSBlcyBkZSB1biA2NCUuIFBhcmEgZWwgZ3LDoWZpY28gMTgsIHVuYSBtYXlvciBwb2JsYWNpw7NuIHNlIGVuY3VlbnRyYSB0cmFiYWphbmRvIGVuIHVuIHNlY3RvciBmb3JtYWwsIHBvciBsbyBxdWUgc3VzIGluZ3Jlc29zIG9zY2lsYXLDrWFuIGVudHJlIFMvLjIwMDAgYSBtw6FzLiBQb3Igb3RybyBsYWRvLCBlbCBzZWN0b3IgaW5mb3JtYWwgZXMgZWwgcXVlIG1lbm9zIHBvYmxhY2nDs24gcHJlc2VudGEsIG1lbm9yIGEgcXVpbmNlIHBlcnNvbmFzIGFwcm94aW1hZGFtZW50ZS4gRXN0YSBwb2JsYWNpw7NuLCBzZWfDum4gbG8gY2l0YWRvLCB0ZW5kcsOhIHVuIHNhbGFyaW8gdHJlcyB2ZWNlcyBtZW5vciBhbCBkZWwgc2VjdG9yIGZvcm1hbC4KCiMjIyBFbXBsZW8KYGBge3J9CnBhcihtYWkgPSBjKDEsIDEuNSwgMC41LCAwLjUpKQpkZl9mb3JtMiRlbXBsZW8gJT4lCiAgICB0YWJsZSgpICU+JQogICAgc29ydChUUlVFKSAlPiUKICAgIGJhcnBsb3QoaG9yaXogPSBUUlVFLCBsYXMgPSAyLCB4bGFiID0gIlBlcnNvbmFzIiwgeWxhYj0iIikKCnRpdGxlKCJHcsOhZmljbyAyMy4gVGlwbyBkZSB0cmFiYWpvIikKYGBgCgojIFJlc3BvbmRpZW5kbyBsYXMgcHJlZ3VudGFzIGNhdXNhbGVzCgojIyDCv1F1w6kgZmFjdG9yZXMgZGV0ZXJtaW5hbiBxdWUgbGEgcHJvcGFnYWNpw7NuIGRlbCBDb3ZpZCAxOSBzZSBkZXNhY2VsZXJlPwoKIyMjIERlc2FjZWxlcmFjacOzbiBkZWwgY29udGFnaW8KYGBge3J9CmRmX2Zvcm0yJGRlY2NlbGVyYXRpb24gJT4lCiAgICB1bmxpc3QoKSAlPiUKICAgIHRhYmxlKCkgJT4lCiAgICBzb3J0KFRSVUUpICU+JQogICAga25pdHI6OmthYmxlKGNvbC5uYW1lcyA9IGMoIk1lZGlkYSIsICJQZXJzb25hcyBxdWUgbG8gYXBydWViYW4iKSkKYGBgCgojIFJlc3BvbmRpZW5kbyBsYXMgcHJlZ3VudGFzIG1lY2Fuw61zdGljYXMKCiMjIMK/Q8OzbW8gY2llcnRhcyBjb25kaWNpb25lcyBkZXRlcm1pbmFuIHF1ZSBsYSBwcm9wYWdhY2nDs24gZGVsIENPVklEIHNlIGFjZWxlcmU/CgojIyMgQWNlbGVyYWNpw7NuIGRlbCBjb250YWdpbwpgYGB7cn0KZGZfZm9ybTIkYWNjZWxlcmF0aW9uICU+JQogICAgdW5saXN0KCkgJT4lCiAgICB0YWJsZSgpICU+JQogICAgc29ydChUUlVFKSAlPiUKICAgIGtuaXRyOjprYWJsZShjb2wubmFtZXMgPSBjKCJGYWN0b3IiLCAiUGVyc29uYXMgcXVlIGxvIGFwcnVlYmFuIikpCmBgYAoKIyBEaXNjdXNpw7NuIGRlIHJlc3VsdGFkb3MKCiMjIFBhdHJvbmVzOgoKMS4gUHVkaW1vcyBub3RhciBxdWUgbGEgY3VydmEgZGUgY2Fzb3MgdG90YWxlcyBtdWVzdHJhIHVuIGNyZWNpbWllbnRvIGNvbnRpbnVvIGVuIGVsIHRpZW1wbywgZXZpZGVuY2nDoW5kb3NlIHVuIGNhbWJpbyBubyBzaWduaWZpY2F0aXZvIGVudHJlIGFudGVzIHkgZGVzcHXDqXMgZGUgaGFiZXIgdG9tYWRvIGNhZGEgbWVkaWRhLgoKMi4gRW4gY3VhbnRvIGEgbG9zIG51ZXZvcyBjYXNvcyBwb3IgZMOtYSBwdWRpbW9zIG5vdGFyIHF1ZSB0b2RhcyBsYXMgZ3LDoWZpY2FzIG11ZXN0cmFuIHVuYSB2YXJpYWNpw7NuIGNvbnNpZGVyYWJsZSBlbiBsYSBjYW50aWRhZCBkZSBjYXNvcyBkaWFyaW9zIHBvY29zIGTDrWFzIGRlc3B1w6lzIGRlIHF1ZSBzZSBhcGxpY2FyYSBjYWRhIG1lZGlkYS4gRXN0YXMgdmFyaWFjaW9uZXMgc2UgdmVuIGNvbW8gZGF0b3MgYXTDrXBpY29zIGVuIGxhcyBncsOhZmljYXMuCgozLiBFbiBsYXMgZ3LDoWZpY2FzIGRlIG1vdmlsaXphY2nDs24gc29jaWFsIHNpIHNlIHB1ZWRlIHZlciBjbGFyYW1lbnRlIGVsIGVmZWN0byBkZSBsYXMgbWVkaWRhcyByZXNwZWN0aXZhcyBlbiBlbGxhcy4gRWwgZXN0YWRvIGRlIGVtZXJnZW5jaWEgaGl6byBxdWUgbGEgbW92aWxpemFjacOzbiBzb2NpYWwgZGlzbWludXllcmEgZW4gZ3JhbiBtZWRpZGEgeSBsYSBub3JtYSBkZSBzYWxpciBkw61hcyBlc3BlY8OtZmljb3MgZGUgbGEgc2VtYW5hIHRhbWJpw6luIHR1dm8gdW4gaW1wYWN0byBlbiBsYSBtb3ZpbGl6YWNpw7NuIGNpZXJ0b3MgZMOtYXMgZGUgbGEgc2VtYW5hLgoKNC4gQXNpbWlzbW8sIG90cm8gcGF0csOzbiBlbmNvbnRyYWRvIGVzIHF1ZSBwYXJhIGxhcyBwb2JsYWNpb25lcyBkZSB1biBlc3RhdHVzIHNvY2lhbCBzb2x2ZW50ZSAoaW5ncmVzb3MgbWF5b3JlcyBhIDQwMDApIHkgZXN0ZSBzaWVuZG8gZGUgdW4gZGV0ZXJtaW5hZG8gZGlzdHJpdG8gcHJlc2VudGEgdW4gbWVub3IgbsO6bWVybyBkZSBjb250YWdpYWRvcy4gRXN0byBzZSBjdW1wbGUgcGFyYSBCYXJyYW5jbywgU3VycXVpbGxvIHkgU2FudGlhZ28gZGUgU3VyY28uIE5vIG9ic3RhbnRlLCBzaSBub3MgZGlyaWdpbW9zIGEgYW5hbGl6YXIgZGV0ZXJtaW5hZGFzIHBvYmxhY2lvbmVzIGRvbmRlIGVsIG7Dum1lcm8gZGUgaW5mZWN0YWRvcyBlcyBlbGV2YWRvIHkgbm9zIGZpamFtb3MgZW4gZWwgaW5ncmVzbyBwcm9tZWRpbyBwb2RlbW9zIGRhciBjdWVudGEgcXVlIGxhIG1heW9yIHBhcnRlIG9zY2lsYSBlbnRyZSBjZXJvIGEgbWlsIHNvbGVzIG1lbnN1YWxlcy4gQmFzdGEgcGFyYSBpbHVzdHJhciwgQ29tYXMsIGRpc3RyaXRvIHF1ZSB0aWVuZSB1biBpbmdyZXNvIGRlIGNlcm8gYSBtaWwgeSBjdXlvIG7Dum1lcm8gZGUgY2Fzb3MgYXNjaWVuZGUgYSBjYXNpIDkwMDAuCgo1LiBVbiBwYXRyw7NuIG11eSBpbnRlcmVzYW50ZSBlcyBxdWUgbG9zIGRpc3RyaXRvcyBxdWUgcHJlc2VudGFuIHVuYSBlbXBsZWFiaWxpZGFkIGZvcm1hbCB0aWVuZSB1bmEgbWF5b3IgY2FudGlkYWQgZGUgaW5ncmVzb3MuIEJhc3RhIHBhcmEgaWx1c3RyYXIsIEJhcnJhbmNvIHRpZW5lIHVuIGluZ3Jlc28gZGUgYWxyZWRlZG9yIGRlIDQwMDAgc29sZXMgY29uIHVuYSBlbXBsZWFiaWxpZGFkIGluZm9ybWFsLCBtaWVudHJhcyBxdWUgbG9zIHRyZXMgcmVzdGFudGVzIHRpZW5lbiB1biBpbmdyZXNvIG1heW9yIGEgODAwMCBzb2xlcyBjb24gdW4gdGlwbyBkZSBlbXBsZW8gZm9ybWFsLgoKNi4gU2Ugb2JzZXJ2w7MgcXVlIGxhIG1heW9yw61hIGRlIHZlY2VzLCBsb3MgIGluZ3Jlc29zIG1lbnN1YWxlcyBtw6FzIGFsdG9zIGZhdm9yZWPDrWFuIGEgbWVub3JlcyBmcmVjdWVuY2lhcyBkZSBzYWxpZGEgcXVlIGxhIG1lZGlhbmEgZW4gc2FsaWRhcyBkZWwgcmFuZ28gbcOhcyBiYWpvIGRlIGluZ3Jlc29zLgoKNy4gU2Ugb2JzZXJ2w7MgcXVlIGxhIG1lZGlhbmEgZGUgbGFzIGVkYWRlcyBubyBjYW1iacOzIG11Y2hvIGEgbWVkaWRhIHF1ZSBhdW1lbnRhYmFuIGxhcyBmcmVjdWVuY2lhcyBkZSBzYWxpZGEuIExhcyBkaXN0cmlidWNpb25lcyBkZSBsYXMgZWRhZGVzIHBhcmEgY2FkYSBmcmVjdWVuY2lhIGRlIHNhbGlkYSBubyByZXN1bHRhcm9uIG11eSBkaWZlcmVudGVzLiBTaW4gZW1iYXJnbywgcGFyZWPDrWEgcXVlIHBlcnNvbmFzIGNvbiBtZW5vciBlZGFkIGEgMjUgYcOxb3MgdGVuw61hbiBtZW5vcmVzIGZyZWN1ZW5jaWFzIGRlIHNhbGlkYS4KCjguIFNlIG9ic2VydsOzIHF1ZSBsYSBjYW50aWRhZCBkZSBvYnNlcnZhY2lvbmVzIHBvciBnw6luZXJvLCB0aXBvIGRlIHRyYWJham8gcmVzdWx0YW4gZGlzcGVyc2FzIHBhcmEgY2FkYSBhdW1lbnRvIGVuIGxhIGZyZWN1ZW5jaWEgZGUgc2FsaWRhLiBTaW4gZW1iYXJnbywgbG9zIGhvbWJyZXMgcGFyZWPDrWFuIHNlciBmYXZvcmVjaWRvcyBhIHRlbmVyIHVuYSBtYXlvciBpbmNpZGVuY2lhIGVuIGxhIGZyZWN1ZW5jaWEgZGUgc2FsaWRhLCBubyBzZSBtdWVzdHJhIHVuIGNvbXBvcnRhbWllbnRvIGRlZmluaWRvLgoKIyBIaXDDs3Rlc2lzLCByZWxhY2nDs24gbW92aWxpZGFkIHNvY2lhbC0+IGNhc29zIGNvdmlkLTE5OgoKKiAxKSBIMDogTWF5b3JlcyBjYXNvcyBkdXJhbnRlIGxhIG1lZGlkYSBkZSBpbm1vdmlsaXphY2nDs24gc29jaWFsIG5vIGltcGxpY2EgbmVjZXNhcmlhbWVudGUgdW4gYXVtZW50byBkZSBsYSBtb3ZpbGl6YWNpw7NuIHNvY2lhbC4KSDE6IE1heW9yZXMgY2Fzb3MgZHVyYW50ZSBsYSBtZWRpZGEgZGUgaW5tb3ZpbGl6YWNpw7NuIHNvY2lhbCBzdXBvbmUgdW4gYXVtZW50byBkZSBsYSBjYW50aWRhZCBkZSBwZXJzb25hcyBxdWUgc2UgbW92aWxpemFuCgoqIDIpIEgwOiBNZW5vcmVzIG1vdmlsaXphY2lvbmVzIGR1cmFudGUgbGEgbWVkaWRhIEFwcm9iYWNpw7NuIGRlbCBQYWRyw7NuIGRlIEhvZ2FyZXMgZ2VuZXLDsyBtw6FzIGluZmVjdGFkb3MKSDE6IE1heW9yZXMgbW92aWxpemFjaW9uZXMgZHVyYW50ZSBsYSBtZWRpZGEgQXByb2JhY2nDs24gZGVsIFBhZHLDs24gZGUgSG9nYXJlcyBnZW5lcsOzIG3DoXMgaW5mZWN0YWRvcwoKIyMgSGlww7N0ZXNpcywgZW4gcmVsYWNpw7NuIGEgbGFzIGVuY3Vlc3RhczoKCiogMSkgIEgwOiBMYXMgcGVyc29uYXMgY29uIG1lbm9yZXMgZnJlY3VlbmNpYXMgZGUgc2FsaWRhIG5vIG5lY2VzYXJpYW1lbnRlIHRpZW5lbiBpbmdyZXNvcyAgICAgICAgICAgICBtZW5zdWFsZXMgbWF5b3JlcyBhIDEwMDAgc29sZXMuCiAgICAgIEhJOkxhcyBwZXJzb25hcyBjb24gbWVub3JlcyBmcmVjdWVuY2lhcyBkZSBzYWxpZGEgdGllbmVuIGluZ3Jlc29zIG1lbnN1YWxlcyBtYXlvcmVzIHF1ZSAgICAgICAgICAxMDAwIHNvbGVzLgoKKiAyKSBIMDogbGFzIHBlcnNvbmFzIGNvbiBtZW5vciBlZGFkIGRlIDI1IGHDsW9zIG5vIG5lY2VzYXJpYW1lbnRlIHRpZW5lbiBtZW5vcmVzIGZyZWN1ZW5jaWFzIGRlICAgICAgIHNhbGlkYQogICAgIEhJOiBsYXMgcGVyc29uYXMgY29uIG1lbm9yIGVkYWQgZGUgMjUgYcOxb3MgdGllbmVuIG1lbm9yZXMgZnJlY3VlbmNpYXMgZGUgc2FsaWRhCgoqIDMpIEgwOiBsYXMgcGVyc29uYXMgZGUgZ2VuZXJvIG1hc2N1bGlubyBubyBuZWNlc2FyaWFtZW50ZSB0aWVuZW4gbWF5b3JlcyBmcmVjdWVuY2lhcyBkZSBzYWxpZGEKICAgICBISTogbGFzIHBlcnNvYW5hcyBkZSBnZW5lcm8gbWFzdWN1bGlubyB0aWVuZW4gbWF5b3JlcyBmcmVjdWVuY2lhcyBkZSBzYWxpZGEKCiMjIFBhcsOhbWV0cm9zIGRlIGVzdHVkaW8KQSBwYXJ0aXIgZGUgbG9zIGRhdG9zIG9idGVuaWRvcyBkZSBsYXMgZW5jdWVzdGEsIHNlIGVzdGFibGVjZW4gcGFyw6FtZXRyb3MgZGUgaW50ZXLDqXMgcXVlIHBlcm1pdGVuIGN1YW50aWZpY2FyIGxhIGNvbmZpYWJpbGlkYWQgZGVsIGVzdHVkaW8gcmVhbGl6YWRvOgoKfFBvYmxhY2nDs24gfCBUYW1hw7FvIGRlIGxhIG11ZXN0cmEgIChwZXJzb25hcyBlbnRyZXZpc3RhZGFzKSB8IFNpZ25pZmljYW5jaWEgKM6xKSB8IE5pdmVsIGRlIGNvbmZpYW56YSAoMS3OsSkgfAp8LS0tfC0tLS0tLS0tLS18LS0tLS0tfAp8IDgwMDAwMDAgfDM2MHwgNSV8IDk1JXwKCiNJbnRlcnZhbG9zIGRlIGNvbmZpYW56YSBwYXJhIGxhIG1lZGlhIGRlIHZhcmlhYmxlcyBjdWFudGl0YXRpdmFzIGRlIGVuY3Vlc3RhCgpgYGB7cn0KIyBJbnRlcnZhbG9zIGRlIGNvbmZpYW56YSBwYXJhIGxhIG1lZGlhIGRlIGxhIHZhcmlhYmxlIEZyZWN1ZW5jaWFfc2FsaWRhX3Bvcl9TZW1hbmEKbj1sZW5ndGgoZGZfZm9ybTIkc2FsaWRhc18pCnluPW1lYW4oZGZfZm9ybTIkc2FsaWRhc18pCgplc249c2QoZGZfZm9ybTIkc2FsaWRhc18pL3NxcnQobikKYWxmYT0wLjA1CnBhcmFtZXRyb19lc3RhZGlzdGljbz1xbm9ybShhbGZhLzIsbG93ZXIudGFpbCA9IEZBTFNFKQpsaW1faW5mZXJpb3I9eW4tcGFyYW1ldHJvX2VzdGFkaXN0aWNvKmVzbgpsaW1fc3VwZXJpb3I9eW4rcGFyYW1ldHJvX2VzdGFkaXN0aWNvKmVzbgpyb3VuZChsaW1fc3VwZXJpb3IsMikKcm91bmQobGltX2luZmVyaW9yLDIpCgpyb3VuZChwYXJhbWV0cm9fZXN0YWRpc3RpY28qZXNuLDIpCmBgYAokJCBsLnN1cGVyaW9yICwgbC5pbmZlcmlvcj15bigrLy0pIHBhcmFtZXRyby5lc3RhZGlzdGljbyplc24kJAokJCBsLnN1cGVyaW9yPSAyLjY3LCBsLmluZmVyaW9yPTIuMzIkJAoKYGBge3J9CiMgSW50ZXJ2YWxvcyBkZSBjb25maWFuemEgcGFyYSBsYSBtZWRpYSBkZSBsYSB2YXJpYWJsZSBlZGFkCm49bGVuZ3RoKGRmX2Zvcm0yJGVkYWQpCmFsZmE9MC4wNQp5bjI9bWVhbihkZl9mb3JtMiRlZGFkKQplc24yPXNkKGRmX2Zvcm0yJGVkYWQpL3NxcnQobikKcGFyYW1ldHJvX2VzdGFkaXN0aWNvMj1xbm9ybShhbGZhLzIsbG93ZXIudGFpbCA9IEZBTFNFKQpsaW1faW5mZXJpb3I9eW4yLXBhcmFtZXRyb19lc3RhZGlzdGljbzIqZXNuMgpsaW1fc3VwZXJpb3I9eW4yK3BhcmFtZXRyb19lc3RhZGlzdGljbzIqZXNuMgpyb3VuZChsaW1fc3VwZXJpb3IsMikKcm91bmQobGltX2luZmVyaW9yLDIpCnJvdW5kKHBhcmFtZXRyb19lc3RhZGlzdGljbzIqZXNuMiwyKQoKYGBgCgokJCBsLnN1cGVyaW9yICwgbC5pbmZlcmlvcj15bjIoKy8tKSBwYXJhbWV0cm8uZXN0YWRpc3RpY28yKmVzbjIkJAokJCBsLnN1cGVyaW9yPSAzNC43NywgbC5pbmZlcmlvcj0zMi4wMyQkCgoKYGBge3J9CigxMDAwICogKGFzLm51bWVyaWMoZGZfZm9ybTIkaW5ncmVzbykgLSAxKSkgLT4gaW5ncmVzb3MKCiMgSW50ZXJ2YWxvcyBkZSBjb25maWFuemEgcGFyYSBsYSBtZWRpYSBkZSBsYSB2YXJpYWJsZSBpbmdyZXNvCm49bGVuZ3RoKGRmX2Zvcm0yJGluZ3Jlc28pCmFsZmE9MC4wNQp5bjM9bWVhbihpbmdyZXNvcykKZXNuMz1zZChpbmdyZXNvcykvc3FydChuKQpwYXJhbWV0cm9fZXN0YWRpc3RpY28zPXFub3JtKGFsZmEvMixsb3dlci50YWlsID0gRkFMU0UpCmxpbV9pbmZlcmlvcj15bjMtcGFyYW1ldHJvX2VzdGFkaXN0aWNvMyplc24zCmxpbV9zdXBlcmlvcj15bjMrcGFyYW1ldHJvX2VzdGFkaXN0aWNvMyplc24zCnJvdW5kKGxpbV9zdXBlcmlvciwyKQpyb3VuZChsaW1faW5mZXJpb3IsMikKcm91bmQocGFyYW1ldHJvX2VzdGFkaXN0aWNvMyplc24zLDIpCmBgYAokJCBsLnN1cGVyaW9yICwgbC5pbmZlcmlvcj15bjMoKy8tKSBwYXJhbWV0cm8uZXN0YWRpc3RpY28zKmVzbjMkJAokJCBsLnN1cGVyaW9yPSAyNjc0LjQ1LCBsLmluZmVyaW9yPTIwNjQuNDQkJAoKCiMgVmFsb3JlcyBkZSBpbnRlcsOpcwoKfFZhcmlhYmxlcyBjdWFudGl0YXRpdmFzIHwgUmFuZ28gfCBNZWRpYSB8IEludGVydmFsbyBkZSBjb25maWFuemEgfAp8LS0tfC0tLS0tLS0tLS18LS0tLS0tfAp8IEVkYWQgfFsxNyw2N10gfCAzOS44fCB1IMKxIDEuMzd8CnwgRnJlY3VlbmNpYSBkZSBzYWxpZGEgcG9yIHNlbWFuYSB8WzAsNl0gICB8IDIuNXwgdSDCsSAwLjE3fAp8IEluZ3Jlc298IFswLDkwMDBdfCAyMzY5fCB1IMKxIDMwNS4wMXwKCkNvbm9jZXIgbG9zIGludGVydmFsb3MgZGUgY29uZmlhbnphICBwYXJhIGxhIG1lZGlhIGRlIGxhIGVkYWQsIHBlcm1pdGUgc2FiZXIgIGNvbiB1bmEgY29uZmlhbnphIGRlbCA5NSUgcXXDqSB0YW4gY2VyY2EgZXN0w6FuIGxhcyBlZGFkZXMgZW4gcHJvbWVkaW8gY29uIGVsIHZhbG9yIGVzcGVyYWRvIGRlIGxhIGRpc3RyaWJ1Y2nDs24gbm9ybWFsLiAgRXN0byBzaWduaWZpY2EgcXVlIGVsIGludGVydmFsbyBkZSBlZGFkZXMgZW4gbGEgbXVlc3RyYSwgZW50cmUgMzgtNDAgYcOxb3MgcmVwcmVzZW50YW4gZWwgOTUlIGRlIGNvbmZpYW56YSBwYXJhIGxhIG1lZGlhLgpSZXNwZWN0byBhIGxhIGZyZWN1ZW5jaWEgZGUgc2FsaWRhLCB5YSBxdWUgZWwgaW50ZXJ2YWxvIGRlIGNvbmZpYW56YSBkZSBsYSBtZWRpYSBlcyBtdXkgcGVxdWXDsW8gaW5kaWNhIHF1ZSBkdXJhbnRlIGNhZGEgdW5hIGRlIGxhcyBtZWRpZGFzIGFwbGljYWRhcyBsYSBtYXlvcsOtYSBkZSBwZXJzb25hcyBlbnRyZXZpc3RhZGFzIHNhbGllcm9uIDIgdmVjZXMgYSBsYSBzZW1hbmEuCgoKIyBQcnVlYmFzIGRlIEhpcMOzdGVzaXM6CiMjIEhpcMOzdGVzaXMsIGVuIHJlbGFjacOzbiBhIGxhcyBlbmN1ZXN0YXM6CiogMSkgIEgwOiBMYXMgcGVyc29uYXMgY29uIG1lbm9yZXMgZnJlY3VlbmNpYXMgZGUgc2FsaWRhIG5vIG5lY2VzYXJpYW1lbnRlIHRpZW5lbiBpbmdyZXNvcyAgICAgICAgICAgICBtZW5zdWFsZXMgbWF5b3JlcyBhIDEwMDAgc29sZXMuCiAgICAgIEhJOkxhcyBwZXJzb25hcyBjb24gbWVub3JlcyBmcmVjdWVuY2lhcyBkZSBzYWxpZGEgdGllbmVuIGluZ3Jlc29zIG1lbnN1YWxlcyBtYXlvcmVzIHF1ZSAgICAgICAgICAxMDAwIHNvbGVzLgoKClBhcmEgZGV0ZXJtaW5hciBjw7phbCBoaXDDs3Rlc2lzIGNvcnJlc3BvbmRlIGEgbGEgY29uZmlhbnphIHkgdG9sZXJhbmNpYSBxdWUgZXNwZXJhbW9zIG9idGVuZXIsIGRldGVybWluYW1vcyBsYXMgcGVyc29uYXMgcXVlIHRpZW5lbiB1biBpbmdyZXNvIG1heW9yIGEgMTAwMCBzb2xlcy4KYGBge3J9CnN1bW1hcnkoZGZfZm9ybTIkZWRhZCkKCnN1bW1hcnkoZGZfZm9ybTIkc2FsaWRhc18pCmBgYAoKYGBge3J9CiNQcnVlYmEgZGUgaGlwb3Rlc2lzIGVuY3Vlc3RhCgpkZl9mb3JtMiAlPiVmaWx0ZXIoaW5ncmVzbz09IlswLTEwMDApIikgJT4lIGdyb3VwX2J5KGluZ3Jlc28pICU+JQogICAgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKHNhbGlkYXNfLCBuYS5ybSA9IFRSVUUpKSAlPiUKICAgIHN1bW1hcmlzZShtZWFuID0gbWVhbihtZWFuKSkgJT4lCiAgICBhcy5udW1lcmljKCkgLT4gcHJvbWVkaW9fbWF5b3IKCgojdC50ZXN0KGRmX2Zvcm0yJHNhbGlkYXNfLG11PXByb21lZGlvX3RvdGFsLGFsdGVybmF0aXZlID0gImdyZWF0ZXIiLGNvbmYubGV2ZWw9MC45NSkKcHJvbWVkaW9fbWF5b3IKCmBgYAoKYGBge3J9Cm49bGVuZ3RoKGRmX2Zvcm0yJHNhbGlkYXNfKQp4YmFycmE9bWVhbihkZl9mb3JtMiRzYWxpZGFzXykKZGVzdl9lc3RhbmRhcm11ZXN0cmE9c2QoZGZfZm9ybTIkc2FsaWRhc18pCmRlc3ZiYXJyYT1kZXN2X2VzdGFuZGFybXVlc3RyYS9zcXJ0KG4pICMgZGVzdmlhY2lvbiBlc3RhbmRhciBkZSBwb2JsYWNpb24Kbml2ZWxfY29uZmlhbnphPTAuOTUKbXVfZXZhbHVhcj1wcm9tZWRpb19tYXlvcgp6X29ic2VydmFkbz0oeGJhcnJhLW11X2V2YWx1YXIpL2Rlc3ZiYXJyYSAjIGVzdGFkw61zdGljbyBkZSBwcnVlYmEKcF92YWxvcj1wbm9ybSh6X29ic2VydmFkbykgICMgY29sYSBpenF1aWVyZGEKCnBfc2lnbmlmaWNhbmNpYT0xLW5pdmVsX2NvbmZpYW56YQoKcF92YWxvcgoKcF9zaWduaWZpY2FuY2lhCmBgYAoKRGUgYWN1ZXJkbyBhIGxvIGNhbGN1bGFkbyBlbCBwLXZhbG9yIGVzIG1lbm9yIGEgbGEgc2lnbmlmaWNhbmNpYSAwLjA1IGVzcGVjaWZpY2FkYS4gUG9yIGxvIHF1ZSAgc2UgcmVjaGF6YSBIMCAsIHVuYSBtZW5vciBmcmVjdWVuY2lhIGRlIHNhbGlkYSAgZXMgaW5mbHVlbmNpYWRhIHBvciB0ZW5lciAgaW5ncmVzbyBtYXlvciBhIDEwMDAgc29sZXMuCgoqIDIpIEgwOiBsYXMgcGVyc29uYXMgY29uIG1lbm9zIGVkYWQgZGUgMjUgYcOxb3Mgbm8gbmVjZXNhcmlhbWVudGUgdGllbmVuIG1lbm9yZXMgZnJlY3VlbmNpYXMgZGUgc2FsaWRhCiAgICAgSEk6IGxhcyBwZXJzb25hcyBjb24gbWVub3MgZWRhZCBkZSAyNSBhw7FvcyB0aWVuZW4gbWVub3JlcyBmcmVjdWVuY2lhcyBkZSBzYWxpZGEKClNlIGRldGVybWluYSBsYSBtZWRpYSBkZSBzYWxpZGFzIHBhcmEgIGxhcyBwZXJzb25hcyBjdXlhIGVkYWQgZXMgbWVub3IgZGUgMjUgYcOxb3MuCgpgYGB7cn0KZGZfZm9ybTIgJT4lZmlsdGVyKGVkYWQ8MjUpICU+JSBzdW1tYXJpc2UobWVhbiA9IG1lYW4oc2FsaWRhc18sIG5hLnJtID0gVFJVRSkpICU+JQogICAgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKG1lYW4pKSAlPiUKICAgIGFzLm51bWVyaWMoKSAtPiBlZGFkX3Byb20KZWRhZF9wcm9tCmBgYApgYGB7cn0Kbj1sZW5ndGgoZGZfZm9ybTIkc2FsaWRhc18pCnhiYXJyYT1tZWFuKGRmX2Zvcm0yJHNhbGlkYXNfKQpkZXN2X2VzdGFuZGFybXVlc3RyYT1zZChkZl9mb3JtMiRzYWxpZGFzXykKZGVzdmJhcnJhPWRlc3ZfZXN0YW5kYXJtdWVzdHJhL3NxcnQobikgIyBkZXN2aWFjaW9uIGVzdGFuZGFyIGRlIHBvYmxhY2lvbgpuaXZlbF9jb25maWFuemE9MC45NQptdV9ldmFsdWFyPWVkYWRfcHJvbQp6X29ic2VydmFkbz0oeGJhcnJhLW11X2V2YWx1YXIpL2Rlc3ZiYXJyYSAjIGVzdGFkw61zdGljbyBkZSBwcnVlYmEKcF92YWxvcj1wbm9ybSh6X29ic2VydmFkbykgICMgY29sYSBkZXJlY2hhCgpwX3NpZ25pZmljYW5jaWE9MS1uaXZlbF9jb25maWFuemEKCnBfdmFsb3IKCnBfc2lnbmlmaWNhbmNpYQpgYGAKCkRhZG8gcXVlIGVsIHBfdmFsb3IgZXMgbWF5b3IgYSBsYSBzaWduaWZpY2FuY2lhLCBubyBzZSByZWNoYXphIGxhIEhvLCB5YSBxdWUgaGF5IHBlcnNvbmFzIHF1ZSB0aWVuZW4gbWF5b3IgZWRhZCBxdWUgMjUgYcOxb3MgeSBzYWxlbiBtZW5vcyBxdWUgZWwgcHJvbWVkaW8gZGUgZnJlY3VlbmNpYSBkZSBzYWxpZGEuCgpMYXMgaGlww7N0ZXNpcyBwbGFudGVhZGFzIGVuIHJlbGFjacOzbiBhbCB0aXBvIGRlIHRyYWJham8geSBnZW5lcm8sIHNlIGNvcnJvYm9yYXLDoW4gcG9zdGVyaW9ybWVudGUuCgojRXN0YWTDrXN0aWNhIGluZmVyZW5jaWFsCgojIE51ZXZvcyBjYXNvcyAtPiBjYW1iaW8gbW92aWxpemFjacOzbgoKYGBge3J9CmRmX2luZmVjICU+JSByZW5hbWUoZGF0ZSA9IEZFQ0hBX1JFU1VMVEFETykgLT4gZGZfaW5mZWNfdG1wCmRmX21vdiAlPiUKICAgIGdyb3VwX2J5KGRhdGUpICU+JQogICAgc3VtbWFyaXNlKG1vdiA9IG1lYW4oZ3JvY2VyeV9hbmRfcGhhcm1hY3lfcGVyY2VudF9jaGFuZ2VfZnJvbV9iYXNlbGluZSwgbmEucm09VFJVRSkpIC0+CiAgICBkZl9tb3ZfdG1wCgpkZl9jYXNlX21vdiA8LSBtZXJnZShkZl9pbmZlY190bXAsIGRmX21vdl90bXApCgpwbG90KG1vdn5OLCBkYXRhID0gZGZfY2FzZV9tb3YsIHhsYWI9Ik51ZXZvcyBjYXNvcyIsIHlsYWI9Ik1vdmlsaXphY2nDs24gcG9yIHbDrXZlcmVzIikKY2FzZXNfbW92X2xtIDwtIGxtKG1vdn5OLCBkYXRhID0gZGZfY2FzZV9tb3YpCgpyZXNpZHVvcyA8LSByc3RhbmRhcmQoY2FzZXNfbW92X2xtKQp2YSA8LSBmaXR0ZWQoY2FzZXNfbW92X2xtKQoKYWJsaW5lKGNhc2VzX21vdl9sbSkKYGBgCgpgYGB7cn0Kc3VtbWFyeShjYXNlc19tb3ZfbG0gKQpwbG90KGNhc2VzX21vdl9sbSApCmBgYAoKYGBge3J9CmNvcih4ID0gYXMubnVtZXJpYyhkZl9tb3ZfdG1wJGRhdGUpICwgeSA9IGRmX21vdl90bXAkbW92LCBtZXRob2QgPSAicGVhcnNvbiIpCmBgYAoKCgoKIyBUaXBvIGRlIHRyYWJham8gLT4gRnJlY3VlbmNpYSBkZSBzYWxpZGEgYSBsYSBzZW1hbmEKCiMjIFZhcmlhYmxlIGluZGVwZW5kaWVudGU6IFRpcG8gZGUgdHJhYmFqbwojIyBWYXJpYWJsZSBkZXBlbmRpZW50ZTogRnJlY3VlbmNpYSBkZSBzYWxpZGEgYSBsYSBzZW1hbmEKClBhcmEgZXN0YWJsZWNlciBzaSBleGlzdGUgdW5hIHJlbGFjacOzbiBlbnRyZSBhbWJhcyB2YXJpYWJsZXMsIHNlIHJlcXVpZXJlIGRlIHVuIGluZGljYWRvciBlc3RhZMOtc3RpY28gbnVtw6lyaWNvLkRhZG8gcXVlIGxhIHZhcmlhYmxlIHRpcG8gZGUgdHJhYmFqbyBlcyBjYXRlZ8OzcmljYSBub21pbmFsIHNlIGRpY290b21pemEgZW4gMCwxIHkgYSBwYXJ0aXIgZGUgZWxsbyBtZWRpYW50ZSB1biBjb2VmaWNpZW50ZSBkZSBjb3JyZWxhY2nDs24gYmlzZXJpYWwgcHVudHVhbCBzZSBvYnRpZW5lIGVsIGdyYWRvIGRlIGNvcnJlbGFjacOzbiBkZSBhbWJhcyB2YXJpYWJsZXMuCgpgYGB7cn0KZGZfdHJhYmFqbzwtZGZfZm9ybTIlPiVncm91cF9ieShlbXBsZW8pJT4lZmlsdGVyKGVtcGxlbyE9Ik5vIHRyYWJham8iKSU+JW11dGF0ZShWYXJpYWJsZV9kaWNvdG9taXphZGEgPSBhcy5udW1lcmljKGVtcGxlbyA9PSAiRm9ybWFsIikpJT4lc2VsZWN0KGVtcGxlbyxzYWxpZGFzLFZhcmlhYmxlX2RpY290b21pemFkYSklPiVmaWx0ZXIoc2FsaWRhcyE9Ik1heW9yIDUiKQpkZl90cmFiYWpvCmBgYAoKCgpQYXJhIHNhYmVyIHNpIHVuYSBtYXlvciBmcmVjdWVuY2lhIGRlIHNhbGlkYSBlc3RhIGFzb2NpYWRhIGEgdW4gZW1wbGVvIGRlIHRpcG8gZm9ybWFsLiBTZSBkZXRlcm1pbmEgZWwgY29lZmljaWVudGUgZGUgY29ycmVsYWNpw7NuIGJpc2VyaWFsIHB1bnR1YWwuCgojIyBQcnVlYmFzIGRlIEhpcMOzdGVzaXM6CgoqIEgwOiBObyBleGlzdGUgY29ycmVsYWNpw7NuIGVudHJlIGxhIGZyZWN1ZW5jaWEgZGUgc2FsaWRhIHkgZWwgdGlwbyBkZSB0cmFiYWpvLgoKSDE6IEV4aXN0ZSBjb3JyZWxhY2nDs24gZW50cmUgbGEgZnJlY3VlbmNpYSBkZSBzYWxpZGEgeSBlbCB0aXBvIGRlIHRyYWJham8uCgoKCiQkcmJwPShYMWJhcnJhLVhiYXJyYSkvU1gqc3FydChwL3EpICQkCgpgYGB7cn0KZGZfdHJhYmFqb19pbmZvcm1hbDwtZGZfdHJhYmFqbyU+JWZpbHRlcihWYXJpYWJsZV9kaWNvdG9taXphZGE9PTApICMgdHJhYmFqYWRvcmVzIGluZm9ybWFsZXMKZGZfdHJhYmFqb19mb3JtYWw8LWRmX3RyYWJham8lPiVmaWx0ZXIoVmFyaWFibGVfZGljb3RvbWl6YWRhPT0xKSAjIHRyYWJhamFkb3JlcyBmb3JtYWxlcwpYMWJhcnJhPC1tZWFuKGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRmX3RyYWJham9fZm9ybWFsJHNhbGlkYXMpKSkgI1gxYmFycmE9cHJvbWVkaW8gZGUgbGEgZnJlY3VlbmNpYSBkZSBzYWxpZGEgcHJvbWVkaW8gZGUgbG9zIHRyYWJhamFkb3JlcyBmb3JtYWxlcwpYYmFycmE8LW1lYW4oYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZGZfdHJhYmFqbyRzYWxpZGFzKSkpIyBYYmFycmE9cHJvbWVkaW8gZGUgbGEgZnJlY3VlbmNpYSBkZSBzYWxpZGEgcHJvbWVkaW8gZGVsIHRvdGFsIGRlIHBlcnNvbmFzIGVuY3Vlc3RhZGFzClNYPC1zZChhcy5udW1lcmljKGFzLmNoYXJhY3RlcihkZl90cmFiYWpvJHNhbGlkYXMpKSkgIyBTWD1kZXN2LmVzdMOhbmRhciBkZSBsYSBmcmVjdWVuY2lhIGRlIHNhbGlkYSBwcm9tZWlkbyBkZWwgdG90YWwgZGUgcGVyc29uYXMgZW5jdWVzdGFkYXMKcD1sZW5ndGgoZGZfdHJhYmFqb19mb3JtYWwkVmFyaWFibGVfZGljb3RvbWl6YWRhKS9sZW5ndGgoZGZfdHJhYmFqbyRWYXJpYWJsZV9kaWNvdG9taXphZGEpICAjcD0gcHJvcG9yY2nDs24gZGUgdHJhYmFqYWRvcmVzIGZvcm1hbGVzIGVuIGxhIG11ZXN0cmEKCnE9bGVuZ3RoKGRmX3RyYWJham9faW5mb3JtYWwkVmFyaWFibGVfZGljb3RvbWl6YWRhKS9sZW5ndGgoZGZfdHJhYmFqbyRWYXJpYWJsZV9kaWNvdG9taXphZGEpICNxPXByb3BvcmNpw7NuIGRlIHRyYWJhamFkb3JlcyBpbmZvcm1hbGVzIGVuIGxhIG11ZXN0cmEKCgpyYnA8LSgoWDFiYXJyYS1YYmFycmEpL1NYKSpzcXJ0KHAvcSkgICMgcmJwPWNvZWZpY2llbnRlIGRlIGNvcnJlbGFjacOzbiBiaXNlcmlhbCBwdW50dWFsCnJicAoKYGBgCkVsIGNvZWZpY2llbnRlIGRlIGNvcnJlbGFjacOzbiBiaXNlcmlhbCBwdW50dWFsIGVzIG11eSBiYWpvIHkgbmVnYXRpdm8sIGxhIHRlbmRlbmNpYSBleHBsaWNhIHF1ZSBlcyBiYWphIGxhIGNvcnJlbGFjacOzbiBlbnRyZSBtYXlvciBmcmVjdWVuY2lhIGRlIHNhbGlkYSBwcm9tZWRpbyB5IHVuIHRyYWJham8gZGUgdGlwbyBkZSBpbmZvcm1hbC4KCiMgTWVkaWRhIGRlIElubW92aWxpemFjacOzbiBzb2NpYWwKCiMgVGlwbyBkZSB0cmFiYWpvLT5EaXNtaW51Y2nDs24gZGUgZnJlY3VlbmNpYSBkZSBzYWxpZGEKCiMjIFZhcmlhYmxlIGluZGVwZW5kaWVudGU6IFRpcG8gZGUgdHJhYmFqbwojIyBWYXJpYWJsZSBkZXBlbmRpZW50ZTogRGlzbWludWNpw7NuIGRlIGZyZWN1ZW5jaWEgZGUgc2FsaWRhIHBhcmEgbG9zIHRyYWJhamFkb3JlcyBkZSB0aXBvIGZvcm1hbAoKYGBge3J9CmRmX2lubW92aWxpemFjaW9uPC1kZl9mb3JtMiU+JWdyb3VwX2J5KGVtcGxlbyklPiVmaWx0ZXIoZW1wbGVvIT0iTm8gdHJhYmFqbyIpJT4lbXV0YXRlKFZhcmlhYmxlX2RpY290b21pemFkYSA9IGFzLm51bWVyaWMoZW1wbGVvID09ICJGb3JtYWwiKSklPiVzZWxlY3QoZW1wbGVvLHNvY2lhbC4wNSxWYXJpYWJsZV9kaWNvdG9taXphZGEpCmRmX2lubW92aWxpemFjaW9uCgpgYGAKCiMjIFBydWViYXMgZGUgSGlww7N0ZXNpczoKCiogSDA6IE5vIGV4aXN0ZSBjb3JyZWxhY2nDs24gZW50cmUgbGEgZGlzbWludWNpw7NuIGRlIGZyZWN1ZW5jaWEgZGUgc2FsaWRhIHkgZWwgdGlwbyBkZSB0cmFiYWpvLgoKKiBIMTogRXhpc3RlIGNvcnJlbGFjacOzbiBlbnRyZSBsYSBkaXNtaW51Y2nDs24gZGUgZnJlY3VlbmNpYSBkZSBzYWxpZGEgeSBlbCB0aXBvIGRlIHRyYWJham8uCgpEZXRlcm1pbmFjacOzbiBkZWwgY29lZmljaWVudGUgZGUgY29ycmVsYWNpw7NuIGJpc2VyaWFsIHB1bnR1YWwKCiQkcmJwPShYMWJhcnJhLVhiYXJyYSkvU1gqc3FydChwL3EpICQkCgoKYGBge3J9CmRmX21vdmlsaWRhZDE8LWRmX2lubW92aWxpemFjaW9uJT4lZmlsdGVyKFZhcmlhYmxlX2RpY290b21pemFkYT09MCkKZGZfbW92aWxpZGFkMjwtZGZfaW5tb3ZpbGl6YWNpb24lPiVmaWx0ZXIoVmFyaWFibGVfZGljb3RvbWl6YWRhPT0xKQpYMWJhcnJhPC1tZWFuKGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRmX21vdmlsaWRhZDIkc29jaWFsLjA1KSkpClhiYXJyYTwtbWVhbihhcy5udW1lcmljKGFzLmNoYXJhY3RlcihkZl9pbm1vdmlsaXphY2lvbiRzb2NpYWwuMDUpKSkKU1g8LXNkKGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRmX2lubW92aWxpemFjaW9uJHNvY2lhbC4wNSkpKQoKcD1sZW5ndGgoZGZfbW92aWxpZGFkMiRWYXJpYWJsZV9kaWNvdG9taXphZGEpL2xlbmd0aChkZl9pbm1vdmlsaXphY2lvbiRWYXJpYWJsZV9kaWNvdG9taXphZGEpCgoKcT1sZW5ndGgoZGZfbW92aWxpZGFkMSRWYXJpYWJsZV9kaWNvdG9taXphZGEpL2xlbmd0aChkZl9pbm1vdmlsaXphY2lvbiRWYXJpYWJsZV9kaWNvdG9taXphZGEpCgpyYnA8LSgoWDFiYXJyYS1YYmFycmEpL1NYKSpzcXJ0KHAvcSkKcmJwCgpgYGAKRWwgY29lZmljaWVudGUgcGFyYSBsYSBtZWRpZGEgZGUgSW5tb3ZpbGl6YWNpw7NuIHNvY2lhbCBpbmRpY2EgdW5hIGNvcnJlbGFjacOzbiBtdXkgYmFqYSBlbnRyZSBsYXMgdmFyaWFibGVzLiBFc3RvIHNpZ25pZmljYSBxdWUgbWF5b3JlcyBkaXNtaW51Y2lvbmVzIGVuIGxhIGZyZWN1ZW5jaWEgZGUgc2FsaWRhICBzZSBjb3JyZWxhY2lvbmFuIG11eSBiYWpvIGNvbiBsYXMgcGVyc29uYXMgZGUgdHJhYmFqbyBmb3JtYWwuCgojIE1lZGlkYTogUmV0aXJvIDIwMDAgc29sZXMgZGUgZm9uZG9zIEFGUCBkZSB0cmFiYWphZG9yZXMgYWZpbGlhZG9zCgojIFRpcG8gZGUgdHJhYmFqby0+RGlzbWludWNpw7NuIGRlIGZyZWN1ZW5jaWEgZGUgc2FsaWRhCgojIyBWYXJpYWJsZSBpbmRlcGVuZGllbnRlOlRpcG8gZGUgdHJhYmFqbwojIyBWYXJpYWJsZSBkZXBlbmRpZW50ZTogRGlzbWludWNpw7NuIGRlIGZyZWN1ZW5jaWEgZGUgc2FsaWRhCgoKYGBge3J9CmRmX3JldGlybzwtZGZfZm9ybTIlPiVncm91cF9ieShlbXBsZW8pJT4lZmlsdGVyKGVtcGxlbyE9Ik5vIHRyYWJham8iKSU+JW11dGF0ZShWYXJpYWJsZV9kaWNvdG9taXphZGEgPSBhcy5udW1lcmljKGVtcGxlbyA9PSAiRm9ybWFsIikpJT4lc2VsZWN0KGVtcGxlbyxhZnAxLjA1LFZhcmlhYmxlX2RpY290b21pemFkYSkKZGZfcmV0aXJvCmBgYAojIyBQcnVlYmFzIGRlIEhpcMOzdGVzaXM6CgoqIEgwOiBObyBleGlzdGUgY29ycmVsYWNpw7NuICBlbnRyZSBsYSBkaXNtaW51Y2nDs24gZW4gbGEgZnJlY3VlbmNpYSBkZSBzYWxpZGEgeSBlbCB0aXBvIGRlIHRyYWJham8uCgoqIEgxOiBFeGlzdGUgY29ycmVsYWNpw7NuICBlbnRyZSBsYSBkaXNtaW51Y2nDs24gZW4gbGEgZnJlY3VlbmNpYSBkZSBzYWxpZGEgeSBlbCB0aXBvIGRlIHRyYWJham8uCgpEZXRlcm1pbmFjacOzbiBkZWwgY29lZmljaWVudGUgZGUgY29ycmVsYWNpw7NuIGJpc2VyaWFsIHB1bnR1YWwKJCRyYnA9KFgxYmFycmEtWGJhcnJhKS9TWCpzcXJ0KHAvcSkgJCQKCmBgYHtyfQoKZGZfcmV0aXJvMTwtZGZfcmV0aXJvJT4lZmlsdGVyKFZhcmlhYmxlX2RpY290b21pemFkYT09MCkKZGZfcmV0aXJvMjwtZGZfcmV0aXJvJT4lZmlsdGVyKFZhcmlhYmxlX2RpY290b21pemFkYT09MSkKWDFiYXJyYTwtbWVhbihhcy5udW1lcmljKGFzLmNoYXJhY3RlcihkZl9yZXRpcm8yJGFmcDEuMDUpKSkKWGJhcnJhPC1tZWFuKGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRmX3JldGlybyRhZnAxLjA1KSkpClNYPC1zZChhcy5udW1lcmljKGFzLmNoYXJhY3RlcihkZl9yZXRpcm8kYWZwMS4wNSkpKQoKcD1sZW5ndGgoZGZfcmV0aXJvMiRWYXJpYWJsZV9kaWNvdG9taXphZGEpL2xlbmd0aChkZl9yZXRpcm8kVmFyaWFibGVfZGljb3RvbWl6YWRhKQoKCnE9bGVuZ3RoKGRmX3JldGlybzEkVmFyaWFibGVfZGljb3RvbWl6YWRhKS9sZW5ndGgoZGZfcmV0aXJvJFZhcmlhYmxlX2RpY290b21pemFkYSkKCnJicDwtKChYMWJhcnJhLVhiYXJyYSkvU1gpKnNxcnQocC9xKQpyYnAKCmBgYApFbCBjb2VmaWNpZW50ZSBkZSBjb3JyZWxhY2nDs24gcGFyYSBsYSBtZWRpZGEgZGVsIHJldGlybyBBRlAgZXMgbmVnYXRpdm8geSBiYWpvLiBFbCBzaWdubyBuZWdhdGl2byBzaWduaWZpY2EgcXVlIGVsIGNvbXBvcnRhbWllbnRvIHBvc2l0aXZvIGNvcnJlc3BvbmRlIGEgbG9zIHRyYWJhamFkb3JlcyBpbmZvcm1hbGVzLiBQb3IgbG8gIHF1ZSBtYXlvcmVzICBkaXNtaW51Y2lvbmVzIGRlIGZyZWN1ZW5jaWEgZGUgc2FsaWRhIHNlIGNvcnJlbGFjaW9uYW4gYmFqbyBjb24gbGFzIHBlcnNvbmFzIGRlIHRyYWJham8gaW5mb3JtYWwuCgoKIyBHw6luZXJvIC0+IEZyZWN1ZW5jaWEgZGUgc2FsaWRhIGEgbGEgc2VtYW5hCiMjIFZhcmlhYmxlIGluZGVwZW5kaWVudGU6IEfDqW5lcm8KIyMgVmFyaWFibGUgZGVwZW5kaWVudGU6IEZyZWN1ZW5jaWEgZGUgc2FsaWRhIGEgbGEgc2VtYW5hCgpgYGB7cn0KZGZfZ2VuZXJvPC1kZl9mb3JtMiU+JWdyb3VwX2J5KGdlbmVybyklPiVtdXRhdGUoVmFyaWFibGVfZGljb3RvbWl6YWRhID0gYXMubnVtZXJpYyhnZW5lcm8gPT0gIk1hc2N1bGlubyIpKSU+JXNlbGVjdChnZW5lcm8sc2FsaWRhcyxWYXJpYWJsZV9kaWNvdG9taXphZGEpJT4lZmlsdGVyKHNhbGlkYXMgIT0iTWF5b3IgNSIpCgoKZGZfZ2VuZXJvCmBgYAojIyBQcnVlYmFzIGRlIEhpcMOzdGVzaXM6CgoqIEgwOiBObyBleGlzdGUgdW5hIGNvcnJlbGFjacOzbiBlbnRyZSBmcmVjdWVuY2lhIGRlIHNhbGlkYSBhIGxhIHNlbWFuYSB5IHBlcnNvbmFzIGRlbCBnw6luZXJvIGZlbWVuaW5vLgoKKiBIMTogRXhpc3RlIHVuYSBjb3JyZWxhY2nDs24gZW50cmUgZnJlY3VlbmNpYSBkZSBzYWxpZGEgYSBsYSBzZW1hbmEgeSBwZXJzb25hcyBkZWwgZ8OpbmVybyBmZW1lbmluby4KCgpEZXRlcm1pbmFjacOzbiBkZWwgY29lZmljaWVudGUgZGUgY29ycmVsYWNpw7NuIGJpc2VyaWFsIHB1bnR1YWwKJCRyYnA9KFgxYmFycmEtWGJhcnJhKS9TWCpzcXJ0KHAvcSkgJCQKCgpgYGB7cn0KZGZfZmVtZW5pbm88LWRmX2dlbmVybyU+JWZpbHRlcihWYXJpYWJsZV9kaWNvdG9taXphZGE9PTApCmRmX21hc2N1bGlubzwtZGZfZ2VuZXJvJT4lZmlsdGVyKFZhcmlhYmxlX2RpY290b21pemFkYT09MSkKWDFiYXJyYTwtbWVhbihhcy5udW1lcmljKGFzLmNoYXJhY3RlcihkZl9tYXNjdWxpbm8kc2FsaWRhcykpKQpYYmFycmE8LW1lYW4oYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZGZfZ2VuZXJvJHNhbGlkYXMpKSkKU1g8LXNkKGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRmX2dlbmVybyRzYWxpZGFzKSkpCnA9bGVuZ3RoKGRmX21hc2N1bGlubyRWYXJpYWJsZV9kaWNvdG9taXphZGEpL2xlbmd0aChkZl9nZW5lcm8kVmFyaWFibGVfZGljb3RvbWl6YWRhKQoKCnE9bGVuZ3RoKGRmX2ZlbWVuaW5vJFZhcmlhYmxlX2RpY290b21pemFkYSkvbGVuZ3RoKGRmX2dlbmVybyRWYXJpYWJsZV9kaWNvdG9taXphZGEpCgpyYnA8LSgoWDFiYXJyYS1YYmFycmEpL1NYKSpzcXJ0KHAvcSkKcmJwCgpgYGAKRWwgY29lZmljaWVudGUgZXMgbmVnYXRpdm8gcGFyYSBsYXMgcGVyc29uYXMgZGUgZ8OpbmVybyBtYXNjdWxpbm8sIGVzdG8gc2lnbmlmaWNhIHF1ZSBsYSBjb3JyZWxhY2nDs24gZXMgcG9zaXRpdmEgcGFyYSBsYXMgcGVyc29uYXMgZGUgZ8OpbmVybyBmZW1lbmluby4gRGFkbyBxdWUgZWwgY29lZmljaWVudGUgZXMgcGVxdWXDsW8sIG1heW9yZXMgZnJlY3VlbmNpYXMgZGUgc2FsaWRhIHNlIGNvcnJlbGFjaW9uYW4gYmFqbyBjb24gbGFzIHBlcnNvbmFzIGRlIGfDqW5lcm8gZmVtZW5pbm8uCgoKIyBNZWRpZGE6IERpc3Bvc2ljacOzbiBzYWxpZGEgZGUgaG9tYnJlcyB5IG11amVyZXMgZW4gZMOtYXMgY29tcGxlbWVudGFyaW9zIChsdW5lcy1tacOpcmNvbGVzLXZpZXJuZXMgLyBtYXJ0ZXMtanVldmVzLXPDoWJhZG9zKQoKIyBHw6luZXJvIC0+IERpc21pbnVjacOzbiBkZSBGcmVjdWVuY2lhIGRlIHNhbGlkYSBhIGxhIHNlbWFuYQoKIyMgVmFyaWFibGUgaW5kZXBlbmRpZW50ZTpHZW5lcm8KIyMgVmFyaWFibGUgZGVwZW5kaWVudGU6IERpc21pbnVjacOzbiBkZSBGcmVjdWVuY2lhIGRlIHNhbGlkYSBhIGxhIHNlbWFuYQoKYGBge3J9CmRmX21lZGlkYV9nZW5lcm88LWRmX2Zvcm0yJT4lZ3JvdXBfYnkoZ2VuZXJvKSU+JW11dGF0ZShWYXJpYWJsZV9kaWNvdG9taXphZGEgPSBhcy5udW1lcmljKGdlbmVybyA9PSAiTWFzY3VsaW5vIikpJT4lc2VsZWN0KGdlbmVybyxub2RheS4wNSxWYXJpYWJsZV9kaWNvdG9taXphZGEpCgoKZGZfbWVkaWRhX2dlbmVybwpgYGAKIyMgUHJ1ZWJhcyBkZSBIaXDDs3Rlc2lzOgoKKiBIMDogTm8gZXhpc3RlIHVuYSBjb3JyZWxhY2nDs24gZW50cmUgbGEgZGlzbWludWNpw7NuIGRlIGZyZWN1ZW5jaWEgZGUgc2FsaWRhIGEgbGEgc2VtYW5hIHkgcGVyc29uYXMgZGVsIGfDqW5lcm8gZmVtZW5pbm8uCgoqIEgxOiBFeGlzdGUgdW5hIGNvcnJlbGFjacOzbiBlbnRyZSBsYSBkaXNtaW51Y2nDs24gZGUgZnJlY3VlbmNpYSBkZSBzYWxpZGEgYSBsYSBzZW1hbmEgeSBwZXJzb25hcyBkZWwgZ8OpbmVybyBmZW1lbmluby4KCgpEZXRlcm1pbmFjacOzbiBkZWwgY29lZmljaWVudGUgYmlzZXJpYWw6CiQkcmJwPShYMWJhcnJhLVhiYXJyYSkvU1gqc3FydChwL3EpICQkCgoKCmBgYHtyfQpkZl9tZWRfZmVtZW5pbm88LWRmX21lZGlkYV9nZW5lcm8lPiVmaWx0ZXIoVmFyaWFibGVfZGljb3RvbWl6YWRhPT0wKQpkZl9tZWRfbWFzY3VsaW5vPC1kZl9tZWRpZGFfZ2VuZXJvJT4lZmlsdGVyKFZhcmlhYmxlX2RpY290b21pemFkYT09MSkKWDFiYXJyYTwtbWVhbihhcy5udW1lcmljKGFzLmNoYXJhY3RlcihkZl9tZWRfbWFzY3VsaW5vJG5vZGF5LjA1KSkpClhiYXJyYTwtbWVhbihhcy5udW1lcmljKGFzLmNoYXJhY3RlcihkZl9tZWRpZGFfZ2VuZXJvJG5vZGF5LjA1KSkpClNYPC1zZChhcy5udW1lcmljKGFzLmNoYXJhY3RlcihkZl9tZWRpZGFfZ2VuZXJvJG5vZGF5LjA1KSkpCnA9bGVuZ3RoKGRmX21lZF9tYXNjdWxpbm8kVmFyaWFibGVfZGljb3RvbWl6YWRhKS9sZW5ndGgoZGZfbWVkaWRhX2dlbmVybyRWYXJpYWJsZV9kaWNvdG9taXphZGEpCgoKcT1sZW5ndGgoZGZfbWVkX2ZlbWVuaW5vJFZhcmlhYmxlX2RpY290b21pemFkYSkvbGVuZ3RoKGRmX21lZGlkYV9nZW5lcm8kVmFyaWFibGVfZGljb3RvbWl6YWRhKQoKCnJicDwtKChYMWJhcnJhLVhiYXJyYSkvU1gpKnNxcnQocC9xKSAgI3A9aW5mb3JtYWwvbXVlc3RyYSAsIHE9Zm9ybWFsL211ZXN0cmEKcmJwCgpgYGAKCkVsIGNvZWZpY2llbnRlIGVzIG11eSBiYWpvIHBvciBsbyBxdWUgZXhpc3RlIHVuYSBjb3JyZWxhY2nDs24gbXV5IGJhamEgZW50cmUgbWF5b3JlcyBkaXNtaW51Y2lvbmVzIGRlIGZyZWN1ZW5jaWFzIGRlIHNhbGlkYSBhIGxhIHNlbWFuYSB5IHBlcnNvbmFzIGRlIGdlbmVybyBtYXNjdWxpbm8uCgojIEVkYWQgLT4gRnJlY3VlbmNpYSBkZSBzYWxpZGEKCiMjIFBydWViYXMgZGUgSGlww7N0ZXNpczoKCiogSDA6IE5vIGV4aXN0ZSB1bmEgY29ycmVsYWNpw7NuIGxpbmVhbCBlbnRyZSBsYSBlZGFkIHkgbGEgZnJlY3VlbmNpYSBkZSBzYWxpZGEuCgoqIEgxOiBFeGlzdGUgdW5hIGNvcnJlbGFjacOzbiBsaW5lYWwgZW50cmUgbGEgZWRhZCB5IGxhIGZyZWN1ZW5jaWEgZGUgc2FsaWRhLgoKYGBge3J9CmRhdG9zLmYgPC1hcy5jaGFyYWN0ZXIoZGZfZm9ybTIkc2FsaWRhcykKZGF0b3MubjwtcmVwbGFjZShkYXRvcy5mLGRhdG9zLmY9PSJNYXlvciA1IiwiNiIpCmRhdG9zLm48LWFzLmludGVnZXIoZGF0b3MubikKZWRhZF9mcmVjIDwtIGRhdGEuZnJhbWUoZGZfZm9ybTIkZWRhZCxkYXRvcy5uKQplZGFkX2ZyZWMKcGxvdChkYXRvcy5ufmRmX2Zvcm0yLmVkYWQsZGF0YSA9IGVkYWRfZnJlYywgeGxhYj0iZWRhZCIsIHlsYWI9ImZyZWN1ZW5jaWEgZGUgc2FsaWRhIikKZWRhZF9mcmVjX2xtIDwtIGxtKGRhdG9zLm5+ZGZfZm9ybTIuZWRhZCwgZGF0YSA9ZWRhZF9mcmVjICkKYWJsaW5lKGVkYWRfZnJlY19sbSkKCmNvcih4ID0gZGZfZm9ybTIkZWRhZCAsIHkgPShkYXRvcy5uKSwgbWV0aG9kID0gInBlYXJzb24iKQpgYGAKRWwgY29lZmljaWVudGUgZW4gZXN0YSBzaXR1YWNpw7NuIGVzIG11eSBiYWpvLCBwb3IgbG8gcXVlIG5vIHNlIHB1ZWRlIGRldGVjdGFyIHVuYSByZWxhY2nDs24gZW50cmUgbGFzIHZhcmlhYmxlcyBkZSBlZGFkIHkgZnJlY3VlbmNpYSBkZSBzYWxpZGEuCgojQW5hbGlzaXMgZGUgcmVzaWR1b3MKYGBge3J9CnBsb3QoZWRhZF9mcmVjX2xtKQpzdW1tYXJ5KGVkYWRfZnJlY19sbSkKYGBgCgojIEluZ3Jlc29zIC0+IGZyZWN1ZW5jaWEgZGUgc2FsaWRhCgojIyBQcnVlYmFzIGRlIEhpcMOzdGVzaXM6CgoqIEgwOiBObyBleGlzdGUgY29ycmVsYWNpw7NuIGxpbmVhbCBlbnRyZSAgaW5ncmVzb3MgbWVuc3VhbGVzIHkgIGxhIGZyZWN1ZW5jaWEgZGUgc2FsaWRhIGEgbGEgc2VtYW5hLgoKKiBIMTogRXhpc3RlIGNvcnJlbGFjacOzbiBsaW5lYWwgZW50cmUgaW5ncmVzb3MgbWVuc3VhbGVzIHkgbGEgIGZyZWN1ZW5jaWEgZGUgc2FsaWRhIGEgbGEgc2VtYW5hLgoKCmBgYHtyfQoKI2RmX2Zvcm0yCgooMTAwMCAqIChhcy5udW1lcmljKGRmX2Zvcm0yJGluZ3Jlc28pIC0gMSkpIC0+IHgKYXMubnVtZXJpYyhkZl9mb3JtMiRzYWxpZGFzKSAtIDEgLT4geQoKaW5ncmVzb3NfZnJlYz1sbSh5fngpCnBsb3QoeX54LCB4bGFiPSJJbmdyZXNvcyBtZW5zdWFsZXMiLCB5bGFiPSJmcmVjdWVuY2lhIGRlIHNhbGlkYSIpCmFibGluZShpbmdyZXNvc19mcmVjKQpjb3IoeCwgeSwgbWV0aG9kPSJwZWFyc29uIikKCmBgYApMYSB0ZW5kZW5jaWEgbXVlc3RyYSB1biBsZXZlIGRlY3JlY2ltaWVudG8gZW4gbGEgZnJlY3VlbmNpYSBkZSBzYWxpZGEgYWwgYXVtZW50YXIgbG9zIGluZ3Jlc29zLiBFbCBjb2VmaWNpZW50ZSBkZSBjb3JyZWxhY2nDs24gZGUgcGVhcnNvbiBlcyBuZWdhdGl2byB5IGJham8sIHBvciBsbyBxdWUgc29sbyBleGlzdGUsIGNvbiB1bmEgbXV5IGJhamEgc2lnbmlmaWNhbmNpYSwgdW5hIGNvcnJlbGFjacOTbiBuZWdhdGl2YSBkZSBsYSBmcmVjdWVuY2lhIGRlIHNhbGlkYSByZXNwZWN0byBhIGxvcyBpbmdyZXNvcy4gRGViaWRvIGEgcXVlIGVsIHYuYWJzb2x1dG8gZGVsIGNvZWZpY2llbnRlIGVzIG1lbm9yIGEgMSAtIFxhbHBoYSwgbm8gc2UgcHVlZGUgZGVjaWRpciBsYSB2ZXJhY2lkYWQgZGUgZXN0YSB0ZW5kZW5jaWEuCgpgYGB7cn0Kc3VtbWFyeShpbmdyZXNvc19mcmVjKQpwbG90KGluZ3Jlc29zX2ZyZWMpCmBgYAoKIyBSZXN1bHRhZG9zIGdlbmVyYWxlcwoKLSBBbCBsbGV2YXIgYSBjYWJvIGVsIHByb2NlZGltaWVudG8gZXhwbGljYWRvIHByZXZpYW1lbnRlLCBvYnR1dmltb3MgcXVlIGxhcyBtZWRpZGFzIHF1ZSBtw6FzIGFmZWN0YXJvbiBhIGxhIGlubW92aWxpemFjacOzbiBzb2NpYWwgZnVlcm9uIGVsIGVzdGFkbyBkZSBlbWVyZ2VuY2lhIHkgbGEgYXByb2JhY2nDs24gZGVsIHBhZHLDs24gZGUgaG9nYXJlcy5BIHBhcnRpciBkZSBsYXMgcHJ1ZWJhcyBkZSBoaXDDs3Rlc2lzLCBzZSByZWNoYXphcm9uIGxhcyBoaXDDs3Rlc2lzIG51bGFzLCBwb3IgbG8gcXVlIGV4aXN0ZW4gZGlmZXJlbmNpYSBzaWduaWZpY2F0aXZhcywgZXMgZGVjaXIsIHNlIGZyZW7DsyBsYSBleHBhbnNpw7NuIGRlIGxhIGVuZmVybWVkYWQuCgotIFBvciBvdHJvIGxhZG8sIGVuIGxhIG1lZGlkYSBkZSAiU2FsaWRhIGFsdGVybmFkYSBwb3IgZ8OpbmVybyIgbm8gZXhpc3RlIGRpZmVyZW5jaWFzIHNpZ25pZmljYXRpdmFzIGVudHJlIGxvcyBkb3Mgc2V0cyBkZSBwdW50b3MuIERpY2hvIGRlIG90cm8gbW9kbywgbGEgbWVkaWRhIG5vIHR1dm8gw6l4aXRvIGVuIHJlZHVjaXIgbG9zIG51ZXZvcyBjYXNvcy4gU2kgYmllbiBlcyBjaWVydG8gZXN0YSBtZWRpZGEgZnVuY2lvbmEgYmllbiBwYXJhIGRpc21pbnVpciBsYSBtb3ZpbGl6YWNpw7NuLCBwZXJvIGNvbiBlbCBuaXZlbCBkZSBjYXNvcyBkZSBDb3ZpZC0xOSBzdWNlZGUgbG8gY29udHJhcmlvLCBkYWRvIHF1ZSBlc3RvcyBhdW1lbnRhbiBkZSBtYW5lcmEgc2lnbmlmaWNhdGl2YS4KCi0gUG9jb3MgZMOtYXMgYW50ZXJpb3JlcyBhIGxhIGltcGxlbWVudGFjacOzbiBkZSBsYSBtZWRpZGEgIlBlcm1pc28gZGUgYWRxdWlzaWNpw7NuIGRlIGJpZW5lcyB5IHNlcnZpY2lvcyBiw6FzaWNvcyIgZW4gY29uc2lkZXJhY2nDs24sIGxvcyBudWV2b3MgY2Fzb3MgZW1wZXphcm9uIGEgaW5jcmVtZW50YXIgZGVzcHXDqXMgZGUgaGFiZXJzZSBtYW50ZW5pZG8gcmVsYXRpdmFtZW50ZSBjb25zdGFudGVzIHBvciB1biB0aWVtcG8uIEVsIGluY3JlbWVudG8gZGUgZXN0b3MgbnVldm9zIGNhc29zIGFsIHBhcmVjZXIgZnVlIGNvbnRyb2xhZG8gcG9yIHVub3MgZGlhcyBwb3N0ZXJpb3JlcyBkZSBzZXIgdG9tYWRhIGxhIG1lZGlkYS4gUGFyYSBjb21wcm9iYXIgbGEgc2lnbmlmaWNhbmNpYSBkZSBlc3RhIGRpZmVyZW5jaWEsIHNlIHBsYW50ZcOzIHVuIGYtdGVzdC4gRXN0ZSBkZW1vc3Ryw7MgcXVlIG5vIHNlIHBvZHLDrWEgcmVjaGF6YXIgbGEgaGlww7N0ZXNpcyBudWxhLCBkYWRvIHF1ZSBubyBzZSBlbmNvbnRyYXJvbiBkaWZlcmVuY2lhcyBlbiBlbCByYXRpbyBkZSBhcHJpY2nDs24gZGUgbnVldm9zIGNhc29zLgoKLSBFbiBzdW1hLCBhbCByZWFsaXphciBsYSBwcnVlYmEgZGUgaGlww7N0ZXNpcyBwYXJhIGNhZGEgbWVkaWRhIHkgbGEgY2FudGlkYWQgZGUgY2Fzb3MgcG9yIGTDrWEgcHVkaW1vcyBoYWxsYXIgcXVlIGVuIGdlbmVyYWwsIGxhcyBtZWRpZGFzIGFuYWxpemFkYXMgZnVuY2lvbmFyb24gZGUgbWFuZXJhIHNhdGlzZmFjdG9yaWEuIEVzdG8gc2UgZGViZSBhIHF1ZSBhIHBlc2FyIGRlIHF1ZSBubyB0b2RhcyBpbmZsdXllcm9uIGVuIGxhIG1vdmlsaXphY2nDs24gcmVjcmVhY2lvbmFsLCBzw60gcmVkdWplcm9uIGxhIGNhbnRpZGFkIGRlIGluZmVjdGFkb3MgcG9yIGRpYSBlbiBMaW1hLgoKLSBUcmFzIHJlYWxpemFyIGxhcyBlbmN1ZXN0YXMsIHNlIGVuY29udHLDsyBxdWUgbGEgZnJlY3VlbmNpYSBkZSBzYWxpZGEgb3NjaWxhIGVudHJlIGRvcyB5IHRyZXMgdmVjZXMgYSBsYSBzZW1hbmEuIExhIG1lZGlkYSBxdWUgdHV2byBtYXlvciBhcHJvYmFjacOzbiBmdWUgbGEgaW5tb3ZpbGl6YWNpw7NuLgoKLSBQb3Igb3RyYSBwYXJ0ZSwgZXhpc3RlbiBhbGd1bmFzIHRlbmRlbmNpYXMgY3VhbmRvIHNlIGFuYWxpemFyb24gYWxndW5vcyBkZSBsb3MgZ3LDoWZpY29zIGVuIGJhc2UgYSBsYXMgcmVzcHVlc3RhcyBkZSBsb3MgZW5jdWVzdGFkb3MuIFRhbCBlcyBlbCBjYXNvLCBxdWUgc2UgcHJlc2VudGEgdW4gY29tcG9ydGFtaWVudG8gZW50cmUgbGEgdmFyaWFibGUgaW5ncmVzbyB5IGNhc29zIGluZmVjdGFkb3MuIFRhbCBlcyBlbCBjYXNvIHF1ZSBsYXMgcG9ibGFjaW9uZXMgY29uIG1lbm9yZXMgaW5ncmVzb3MsIGNvbW8gU2FuIEp1YW4gZGUgTHVyaWdhbmNobyBjb24gdW4gaW5ncmVzbyBkZSAwIGEgMTAwMCBlcyBlbCBxdWUgcHJlc2VudGEgbcOhcyBkZSBjYXRvcmNlIG1pbCBpbmZlY3RhZG9zLiBObyBvYnN0YW50ZSwgZW4gY29tcGFyYWNpw7NuIGNvbiBsb3MgZGlzdHJpdG9zIG3DoXMgcHVkaWVudGVzIGNvbW8gQmFycmFuY28gY29uIGluZ3Jlc29zIG1heW9yZXMgYSA0MDAwLCBwcmVzZW50YSBtZW5vcyBkZSBkb3MgbWlsIGNhc29zLgoKLSBTZSBlbmNvbnRyw7MgdW5hIHRlbmRlbmNpYSBlbnRyZSBsYSB2YXJpYWJsZSBlbXBsZW8gZSBpbmdyZXNvcy4gRW4gZWwgZGlzdHJpdG8gZGUgQmFycmFuY28gaHVibyBtYXlvciBjb25jZW50cmFjacOzbiBkZSBwZXJzb25hcyBxdWUgdHJhYmFqYW4gaW5mb3JtYWxtZW50ZSB5IGVzdG9zIHRpZW5lbiB1biBpbmdyZXNvIHF1ZSBvc2NpbGEgZW50cmUgdHJlcyBtaWwgeSBjdWF0cm8gbWlsIHNvbGVzLCBtaWVudHJhcyBxdWUsIGxvcyBxdWUgdGllbmVuIHVuIGVtcGxlbyBmb3JtYWwgY29tbyBTYW4gQm9yamEsIFNhbiBJc2lkcm8geSBTYW50aWFnbyBkZSBTdXJjbyBlbnRyZSBvY2hvIG1pbCB5IG51ZXZlIG1pbCBzb2xlcywgY3VhdHJvIG1pbCB5IGNpbmNvIG1pbCBzb2xlcyB5IHNlw61zIG1pbCB5IHNpZXRlIG1pbCBzb2xlcyByZXNwZWN0aXZhbWVudGUuCgotIEVudHJlIGxvcyBmYWN0b3JlcyBxdWUgbGEgcG9ibGFjacOzbiBkZXRlcm1pbsOzIHNvbiBsb3MgcXVlIGRlc2FjZWxlcmFuIGxhIHByb3BhZ2FjacOzbiBkZWwgY292aWQgLSAxOSBkZXN0YWNhbiBlbCB0b3F1ZSBkZSBxdWVkYSwgbWVkaWRhcyBwcmV2ZW50aXZhcyBzYW5pdGFyaWFzLCBpbm1vdmlsaXphY2nDs24sIGVudHJlIG90cm9zLiBEZWwgbWlzbW8gbW9kbywgbG9zIGZhY3RvcmVzIHF1ZSBhY2VsZWVyYW4gc29uIGxhIGFnbG9tZXJhY2nDs24gZGUgcGVyc29uYXMsIGZhbHRhIGRlIGVkdWNhY2nDs24sIGluZm9ybWFsaWRhZCwgc2lzdGVtYSBkZSBzYWx1ZCwgZXRjLgoKLSBUYW1iacOpbiBwdWRpbW9zIGhhbGxhciBhbGd1bmFzIGluY29uc2lzdGVuY2lhcyBlbiBsYSBpbmZvcm1hY2nDs24gYWRxdWlyaWRhLiBFc3RhcyBpbmNvbnNpc3RlbmNpYXMgcG9kcsOtYW4gcHJvdmVuaXIgZGUgYWxndW5vcyBmYWN0b3JlcyBxdWUgbm8gc2UgdG9tYXJvbiBlbiBjdWVudGEuIFBvciBlamVtcGxvLCB0b2RhcyBsYXMgbWVkaWRhcyBxdWUgbm8gc2UgY29uc2lkZXJhcm9uIHR1dmllcm9uIHVuIGVmZWN0byBhdW5xdWUgc2VhIG3DrW5pbW8gZW4gbGFzIHZhcmlhYmxlcyBhbmFsaXphZGFzLgoKLSBMYSByZWdyZXNpw7NuIG51ZXZvcyBjYXNvcyAtPiBtb3ZpbGl6YWNpw7NuIG5vIGVzIG11eSBidWVuYS4gU3UgY29lZmljaWVudGUgZGUgZGV0ZXJtaW5hY2nDs24gZXMgbXV5IHBlcXVlw7FvLiBBZGVtw6FzIGhheSBlbiBsYSBncsOhZmljYSBkZSBsb3MgcmVzaWR1b3MgaGF5IMOhcmVhcyBjb24gdmFyaW9zIHB1bnRvcy4KCgoKIyBDb25jbHVzaW9uZXMKCi0gUHVkaW1vcyByZWxhY2lvbmFyIGRpZmVyZW50ZXMgbWVkaWRhcyB0b21hZGFzIHBvciBlbCBnb2JpZXJubyBwZXJ1YW5vIGNvbiBsYSBwcm9wYWdhY2lvbiBkZWwgQ09WSUQtMTkgZGUgbWFuZXJhIHNhdGlzZmFjdG9yaWEgeSBhdmVyaWd1YXIgYSB0cmF2w6lzIGRlIHVuIHByb2NlZGltaWVudG8gZXN0YWTDrXN0aWNvIHNpIGxhIHJlbGFjacOzbiBkZSBlc3RhcyBtZWRpZGFzIGNvbiBsYSBpbm1vdmlsaXphY2nDs24gc29jaWFsIGVyYSBzaWduaWZpY2F0aXZhIG8gbm8uIFRhbWJpw6luIHB1ZGltb3MgcmVsYWNpb25hciBsYXMgbWVkaWRhcyBjb24gb3Ryb3MgZmFjdG9yZXMgY29tbyBsYSBjYW50aWRhZCBkZSBjYXNvcyBwb3IgZMOtYSBlIGluZm9ybWFjacOzbiBhZHF1aXJpZGEgYSB0cmF2ZXMgZGUgZW50cmV2aXN0YXMgeSBkYXRvcyBzYWNhZG9zIGRlIGZ1ZW50ZXMgY29uZmlhYmxlcy4KCi0gQ29tbyB5YSBzZSBtZW5jaW9ubyBhbnRlcmlvcm1lbnRlLCBmdWltb3MgY2FwYWNlcyBkZSBoYWxsYXIgbGEgcmVsYWNpw7NuIGVudHJlIGRpZmVyZW50ZXMgdmFyaWFibGVzIHJlbGFjaW9uYWRhcyBhIGxhcyBtZWRpZGFzIGVzY29naWRhcywgbGFzIGVudHJldmlzdGFzIGxsZXZhZGFzIGEgY2FibyB5IGxhIGluZm9ybWFjacOzbiBhZHF1aXJpZGEgZW4gbGEgd2ViIHkgZGVzY3Vicmltb3MgY3XDoWxlcyBkZSBlc3RhcyB2YXJpYWJsZXMgc29uIGxhcyBxdWUgdGllbmVuIG3DoXMgc2VtZWphbnphcy4KCi0gQXByZW5kaW1vcyBhIHV0aWxpemFyIEdpdGh1YiBjb21vIHVuIG1lZGlvIGRlIGNvbXVuaWNhY2nDs24gcXVlIG5vcyBheXVkYSBhIGp1bnRhciB0b2RhIGxhIGluZm9ybWFjacOzbiBkZSBtYW5lcmEgcsOhcGlkYSB5IHNlbmNpbGxhLiBFc3RvIHBlcm1pdGnDsyBxdWUgbGEgY29tdW5pY2FjacOzbiBlbnRyZSBsb3MgaW50ZWdyYW50ZXMgZGVsIGdydXBvIHNlYSBtw6FzIGZsdWlkYSB5IHN1cyBhdmFuY2VzIHNlIGludGVncmVuIGRlIG1hbmVyYSBsw7NnaWNhIHkgZW50ZW5kaWJsZSBlbiBlbCBpbmZvcm1lLgoKLSBGaW5hbG1lbnRlLCBsb2dyYW1vcyBhcHJlbmRlciB0b2RvIGxvIG5lY2VzYXJpbyBlbiBSLXN0dWRpbyBwYXJhIGxsZXZhciBhIGNhYm8gbGEgaW52ZXN0aWdhY2nDs24gZGUgbWFuZXJhIHNhdGlzZmFjdG9yaWEgeSBkZXNhcnJvbGxhciBkZXNjcmlwdG9yZXMgZ3LDoWZpY29zIHF1ZSBheXVkYW4gYSBjb21wcmVuZGVyIGRlIG1lam9yIG1hbmVyYSB0b2RvIGVsIHRyYWJham8uCgoKIyBCaWJsaW9ncmFmw61hCgoKLSBHb29nbGUgTExDLiAoMjAyMCkuIEdvb2dsZSBDT1ZJRC0xOSBDb21tdW5pdHkgTW9iaWxpdHkgUmVwb3J0cyBQZXJ1Li4gUmVjdXBlcmFkbyBlbCA3IGRlIG1heW8gZGUgMjAyMCwgZGUgR29vZ2xlIExMQyBTaXRpbyBXZWI6IGh0dHBzOi8vd3d3LmdzdGF0aWMuY29tL2NvdmlkMTkvbW9iaWxpdHkvMjAyMC0wNC0xMV9QRV9Nb2JpbGl0eV9SZXBvcnRfZW4ucGRmCi0gQW7Ds25pbW8gKDIwMjApLiBBY2Npb25lcyBhZG9wdGFkYXMgcG9yIGVsIGdvYmllcm5vIGFudGUgQ09WSUQtMTkuIFJlY3VwZXJhZG8gZWwgNyBkZSBtYXlvIGRlIDIwMjAsIGRlIFZlbG9zZSBTaXRpbyBXZWI6IGh0dHBzOi8vd3d3LnZlbG9zZS5wZS9ub3RpY2lhcy9hY2Npb25lcy1hZG9wdGFkYXMtcG9yLWVsLWdvYmllcm5vLWFudGUtY292aWQtMTkvCi0gR29iaWVybm8gZGVsIFBlcsO6ICgyMDIwKS4gTm9ybWF0aXZhIHNvYnJlIEVzdGFkbyBkZSBFbWVyZ2VuY2lhIHBvciBDb3JvbmF2aXJ1cy4gUmVjdXBlcmFkbyBlbCA3IGRlIG1heW8gZGUgMjAyMCBkZSBQbGF0YWZvcm1hIGRpZ2l0YWwgZGVsIEVzdGFkbyBQZXJ1YW5vIFNpdGlvIFdlYjogaHR0cHM6Ly93d3cuZ29iLnBlL2luc3RpdHVjaW9uL3BjbS9jb2xlY2Npb25lcy83ODctbm9ybWF0aXZhLXNvYnJlLWVzdGFkby1kZS1lbWVyZ2VuY2lhLXBvci1jb3JvbmF2aXJ1cwotIERlZmVuc29yw61hIGRlbCBQdWVibG8gKDIwMjApLiBDT01QRU5ESU8gREUgTk9STUFTIEVNSVRJREFTIFBPUiBFTCBFU1RBRE8gUEVSVUFOTyBQQVJBIEFGUk9OVEFSIExBIFBST1BBR0FDScOTTiBERUwgQ09WSUQtMTkuIFJlY3VwZXJhZG8gZWwgNyBkZSBtYXlvIGRlIDIwMjAgZGUgRGVmZW5zb3JpYSBkZWwgUHVlYmxvIFNpdGlvIFdlYjogaHR0cHM6Ly93d3cuZGVmZW5zb3JpYS5nb2IucGUvd3AtY29udGVudC91cGxvYWRzLzIwMjAvMDUvQ29tcGVuZGlvLWRlLU5vcm1hcy1DT1ZJRDE5LTA3LjA1LjIwMjAucGRmCg==